我正在使用frisby.js创建HTTP测试,该测试适用于jasmine.js。
我还必须创建一些mongoDB对象来进行测试。 问题是当我想清理这些DB对象时。当其中一个期望失败时,我想拦截它并调用我自己的清理函数。这意味着在每次测试失败后,我将无法从数据库中删除测试对象。</ p>
jasmine中的afterEach函数无法正常工作,jasmine对afterAll或之前的所有功能都没有任何支持。 这就是我今天进行测试的原因。
it("testing userform get with correct userID and expect correct return", function() {
var innerUserId = userID;
frisby.create('Should retrieve correct userform and return 200 when using a valid userID')
.get(url.urlify('/api/userform', {id: innerUserId}))
.expectStatus(200)
.afterJSON(function(userform){
// If any of these fail, the after function wont run.
// I want to intercept the error so that I can make sure that the cleanUp function is called
// afterEach does not work. I have tried with done()
var useridJSON = userform.UserId.valueOf();
var firstnameJSON = userform.firstname.valueOf();
var surnameJSON = userform.surname.valueOf();
expect(firstnameJSON).toMatch(testUser.firstName);
expect(surnameJSON).toMatch(testUser.surname);
expect(useridJSON).toMatch(innerUserId);
})
.after(function(){
cleanUp(innerUserId);
})
.toss();
});
我想知道是否有办法在frisby或jasmine中拦截“expect”的错误,这样我就可以在退出之前调用我自己的清理函数。
完整示例here
答案 0 :(得分:1)
解决此问题的最快方法是将错误代码包装在try-catch中。 这是因为如果发生javascript错误,jasmine将不会继续运行断言。这与断言错误不同。如果发生断言错误,jasmine和frisby将继续测试所有其他断言,然后执行“after”功能。
.afterJSON(function(userform){
try {
var useridJSON = userform.UserId.valueOf();
var firstnameJSON = userform.firstname.valueOf();
var surnameJSON = userform.surname.valueOf();
catch(e) {
cleanUp(innerUserId);
// Can do a throw(e.message); here aswell
}
expect(firstnameJSON).toMatch(testUser.firstName);
expect(surnameJSON).toMatch(testUser.surname);
expect(useridJSON).toMatch(innerUserId);
})
这不是很好的方式,但有效。
我最后添加了throw(e)并将期望放在了最终范围内。这样我就得到了jasmine来呈现测试中出现的所有错误。
答案 1 :(得分:0)
至于“退出前”,这个怎么样:
process.on('uncaughtException', function(err) {
console.error(' Caught exception: ' + err);
});