每次测试前在mocha套件中设置变量?

时间:2017-02-23 10:07:00

标签: javascript mocha

我想在执行测试之前先设置一些变量, 我找到了这个解决方案,Running Mocha setup before each suite rather than before each test

但是,我不知道如何将变量传递给我的回调,他们这样做我会得到未定义的

makeSuite('hello', (context) => {
    it('should return', () => {
        assert.strictEqual(1, 1)
    })
})
makeSuite('world', (context) => {
    it('should return', () => {
        console.log(context) // undefined
        assert.strictEqual(1, 1)
    })
})

function makeSuite(name: string, cb: (context: any) => any) {
    let age: string;
    describe(name, () => {
        beforeEach(() => {
            age = '123'
        })

        cb(age);
    })
}

我之所以要将变量传递给回调是因为,我将有许多需要在beforeEach挂钩设置的私有变量,我不想为所有测试重复我的代码。

2 个答案:

答案 0 :(得分:3)

传递给from datetime import timedelta import dateutil.parser import re start = dateutil.parser.parse("5 Nov 2016 15:00") end = start + timedelta(hours=1) string = "from {start} till {end}".format(start=start, end=end) pattern = '(?:\s*from\s*)' + '(?P<start>.+)' + '(?:\s*till\s*)' + '(?P<end>.+)' + '(?:\s*)' groups = re.match(pattern, string).groupdict() parsed_start = dateutil.parser.parse(groups['start']) parsed_end = dateutil.parser.parse(groups['end']) assert parsed_start == start assert parsed_end == end 的回调会立即被调用,但是当测试执行时,您的describe挂钩会被称为以后。因此,当beforeEach被调用时,cb(age)具有值ageundefined稍后设置为age,但"123"之前已经获得了该值的副本,因此它无效。为了让cb看到更改,您必须将引用传递给您随后变异的对象。像这样:

cb

(我删除了TypeScript类型的注释,使其以纯JavaScript的形式运行。注释对于解决问题并不是至关重要的。)

答案 1 :(得分:0)

我从@Louis的工作开始,但是后来(以我的情况)发现最好围绕它进行功能。这样,我可以切换前后动作。我还需要之前,之后和它是异步的。

function itWithSetup(name, callback, doBefore = true, doAfter = true) {

  let context = null;
  if (doBefore) {
    before(async () => {
     context = await getContext();
    });
  }
  it(name, async () => {
    await callback(context);
  });
  if (doAfter) {
    after(async () => {
      await clearContext();
    });
  }
}

describe("test with context", () => {

  itWithSetup("unit test", async (message) => {

    await testWithContext(context, otherConditions);

  }, true, true);
});