首页 > 解决方案 > 文件中的摩卡访问变量我测试了哪个函数

问题描述

好的,我将尝试解释这个简单的。所以我有这个文件,它有这个变量,然后是我正在测试的函数

let config: Config|undefined;

export default async function onConfigEvent(event: myEvent) {

  if (isDefined(config)) {
    console.log('Ignoring config event because we already have the config.');
    return;
  }

  config = event.config as Config;

  if (!config.firstThing) {
    console.log('config miss first thing.')
    return;
  }

  if (!config.otherthing) {
    console.log('config missing second thing.');
    return;
  }
}

然后我尝试测试这两个否定如果这样

describe('OnConfigEvent', () => {

  it('should log missing second thing', () => {

    let event: ConfigEvent = {
      type: events.Config,
      config: { ["firstThing"]: false }
    }

    let spy = sinon.spy(console, 'log');

    onConfigEvent(event)

    assert(spy.calledWith('Missing first thing.'));

    spy.restore();
  });

  it('should log missing second thing', () => {

    let event: ConfigEvent = {
      type: events.Config,
      config: { ["firstThing"]: true }
    }
    let spy = sinon.spy(console, 'log');

    onConfigEvent(event)

    assert(spy.calledWith('config missing second thing.'));

    spy.restore();
  });
});

这里的问题是,在第一次测试运行后,第二次测试将返回第一个 if 语句"Ignoring config event because we already have the config.",因为在第一次测试期间设置了配置。我如何let gameConfig从我正在测试一个函数的文件中访问它。所以我可以在每次测试之前将它设置为未定义

标签: javascripttestingmocha.jssinon

解决方案


您可以使用rewire来重置config变量的值。

index.ts

type Config = any;
type myEvent = any;
let config: Config | undefined;

function isDefined(obj) {
  return obj !== undefined;
}

export default function onConfigEvent(event: myEvent) {
  if (isDefined(config)) {
    console.log('Ignoring config event because we already have the config.');
    return;
  }

  config = event.config as Config;

  if (!config.firstThing) {
    console.log('config miss first thing.');
    return;
  }

  if (!config.otherthing) {
    console.log('config missing second thing.');
    return;
  }
}

index.test.ts

import sinon from 'sinon';
import { assert } from 'chai';
import rewire from 'rewire';
type ConfigEvent = any;
const events = { Config: 'Config' };

describe('OnConfigEvent', () => {
  let onConfigEvent;
  let mod;
  beforeEach(() => {
    mod = rewire('./');
    onConfigEvent = mod.default;
  });
  afterEach(() => {
    mod.__set__({ config: undefined });
  });
  it('should log missing first thing', () => {
    let event: ConfigEvent = {
      type: events.Config,
      config: { ['firstThing']: false },
    };
    let spy = sinon.spy(console, 'log');
    onConfigEvent(event);
    assert(spy.calledWith('config miss first thing.'));
    spy.restore();
  });

  it('should log missing second thing', () => {
    let event: ConfigEvent = {
      type: events.Config,
      config: { ['firstThing']: true },
    };
    let spy = sinon.spy(console, 'log');
    onConfigEvent(event);
    assert(spy.calledWith('config missing second thing.'));
    spy.restore();
  });
});

带有覆盖率报告的单元测试结果:

  OnConfigEvent
config miss first thing.
    ✓ should log missing first thing
config missing second thing.
    ✓ should log missing second thing


  2 passing (1s)

----------|---------|----------|---------|---------|-------------------
File      | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
----------|---------|----------|---------|---------|-------------------
All files |   83.33 |    66.67 |     100 |   83.33 |                   
 index.ts |   83.33 |    66.67 |     100 |   83.33 | 11,12             
----------|---------|----------|---------|---------|-------------------

推荐阅读