我想在执行测试之前先设置一些变量, 我找到了这个解决方案,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
挂钩设置的私有变量,我不想为所有测试重复我的代码。
答案 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)
具有值age
。 undefined
稍后设置为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);
});