我最近遇到了一个我无法解释的问题。我在这些测试中有很多代码,所以我将尽我最大的努力来捕捉这里的想法
我的测试看起来像:
describe('main page', function() {
beforeEach(function(done){
addUserToMongoDb(done); // #1
});
afterEach(function(done) {
removeUserFromMongoDb(done);
});
context('login', function() {
it('should log the user in', function() {
logUserIn(user_email); // #2 - This line requires the user from the beforeEach
});
});
context('preferences', function() {
before(function(done) { //#3
logUserInBeforeTest(user_email);
});
it('should show the preferences', function() {
doCheckPreferences(); // #4
});
});
});
问题是,beforeEach by #1
运行正常。我可以看到它发生在DB上,#2
中的测试通过了。
但是,#4
上的首选项上下文中的测试失败,因为它找不到用户在#3
上登录。
看起来上下文before
在describe beforeEach
之前执行,这导致它们失败。如果我将logUserIn
移动到it
块中,它就可以正常工作。
什么会导致这种情况?
4条答案
按热度按时间wfveoks01#
虽然这个答案只是再次显示了文档注解,并有一些评论试图帮助显示差异,但应该参考@tomasz-wszelaki下面的答案。
Mocha的测试运行器在Mocha测试运行器的钩子部分最好地解释了这个功能。
从Hooks部分:
您可以将这些例程嵌套在其他describe块中,这些describe块也可以具有before/beforeEach例程。
1l5u6lss2#
我发现了类似的问题。文档是误导性的,因为“在此块之前”意味着(至少对我来说)“在此描述部分之前”。同时,它表示“在任何描述部分之前”。检查以下示例:
输出顺序:
似乎将
before
放在层次结构中的哪个位置并不重要-它将在任何describe之前运行,而不是在其包含的describe之前运行。d7v8vwbk3#
混淆的原因在于摩卡的文档。你可以在Mocha中找到:
测试可以出现在钩子之前、之后或穿插在钩子中。钩子将按照定义的顺序运行;所有before()钩子运行(一次),然后是任何beforeEach()钩子、测试、任何afterEach()钩子,最后是after()钩子(一次)。
讨论的钩子
before
和beforeEach
分别在所有或每个it
之前执行-没有办法在describe部分之前执行它。在这里,你可以找到mocha的master分支的#1贡献者的答案,添加类似
beforeDescribe
钩子的东西。我想你应该看看
--delay
摩卡选项。rpppsulh4#
关键是要有一个
mocha.opts
文件,它的线指向./test/bootstrap.js
,在那里你应用before,beforeAll,after,afterAll钩子。node --inspect
调试标志/package.json
/test/mocha。选择
/test/bootstrap.js
/server.js
/test/service/unSubscriber.test.js