我有一个导出的模块,其中有一个m@containment*[ |java+package:///elib|]
方法,我尝试使用rascal> import analysis::graphs::Graph; // or import Graphs; in older versions
ok
rascal> top(m@containment)
set[loc]: {
|java+package:///org|,
|java+package:///vinju|
}
,editHeroImage
和mocha
进行测试。这些模块有两个作为参数传递的对象chai
和sinon
。这些是connection
个对象,一个包含与数据库的连接,另一个包含在各自模块中定义的查询字符串。我正在导出并尝试测试的queries
是一个“帮助”模块。
我已经成功测试了此模块的其他方法,就像我尝试测试此方法一样,但是,当我遇到因某些原因使用mySql
模块的方法时,我的测试不再表现正如所料。我想知道在这种特殊情况下我是否遗漏了一些内容,因为我已经测试了其他模块和方法,这些模块和方法也使用了expObj
并且没有遇到过这种行为。
当我运行测试时,它会记录“你好!”正如预期的那样,async
被调用的断言失败了。
我在这里失去理智!请帮忙!到底是怎么回事?试衣服之间会有污染吗?
待测方法:
async
测试,设置:
callbackSpy
答案 0 :(得分:1)
您的断言可能在您的异步函数返回之前执行。
有许多方法可以确保您的异步功能已完成执行。最干净的是以不同方式格式化你的摩卡测试。
describe('...', function () {
var callbackSpy;
before(function () {
var _post = {
id: '123',
title: 'vf',
sub_title: 'vf',
slug: 'vf',
reading_time: 4,
created_at: '123',
published_at: '123',
deleted_on: false,
hero_image: 'hero_image_path'
};
var _postId = '123';
queryStub.onCall(0).callsArgWith(2, null, [{
hero_image: '55'
}]);
queryStub.onCall(1).callsArgWith(2, null);
queryStub.onCall(2).callsArgWith(2, null);
return testedModule.editHeroImage(connectionStub, fakeQueriesObj, _postId, _post, function () {
console.log(arguments); // --> {'0': null} as expected
callbackSpy.apply(null, arguments);
});
});
it('edits hero image', function () {
expect(callbackSpy).has.been.calledWith(null);
});
});
请注意,我已将您的断言包装在describe块中,因此我们可以使用before
。您设置存根和执行类的实际逻辑已移至before
块并添加了一个返回,这可确保在继续执行断言之前完成异步功能。
您的其他测试可能已经通过,但他们也会对此感到敏感,这纯粹是一个时间问题。
答案 1 :(得分:0)
事实上,@ Varedis认为这是一个时间问题。但是,使用您在describe bloack中包装断言并使用before函数设置测试的建议导致我的存根不再正常工作。然而,考虑到您对时间安排的建议,我设法通过在我的测试套装中使用完成回调来解决问题。通过保持设置,我做了一个小小的改变,我的测试突然通过了:
it('edits hero image', function(done) {
var _post = {
id: '123',
title: 'vf',
sub_title: 'vf',
slug: 'vf',
reading_time: 4,
created_at: '123',
published_at: '123',
deleted_on: false,
hero_image: 'hero_image_path'
};
var _postId = '123';
queryStub.onCall(0).callsArgWith(2, null, [{hero_image: '55'}]);
queryStub.onCall(1).callsArgWith(2, null);
queryStub.onCall(2).callsArgWith(2, null);
testedModule.editHeroImage(connectionStub, fakeQueriesObj, _postId, _post, function() {
callbackSpy.apply(null, arguments);
expect(callbackSpy).has.been.calledWith(null);
expect(callbackSpy).has.not.been.calledWith('FDgdjghg');
done();
});
});