我正在测试这样的Express函数:
function(request,response,someDependency){
...
someDependency.doStuff(arg1,arg2)
.then(function(someResponse){
response.status(200).send({body: someResponse});
})
.catch(function(error){
response.status(500).send({someResponse: 'error');
});
}
在我的单元测试中(使用Mocha),我决定使用其中的断言来模拟我的响应,并且还模拟我的依赖:
我的mockedResponse的抽象:
...
exports.expectedStatus = function(status){
this.expectedCode = status;
}
exports.status = function(realStatus){
this.expectdCode = realStatus;
return this;
}
exports.send = function(body){
assert.strictEqual(this.realStatus,this.expectedCode);
}
和我的依赖关系的抽象是:
exports.setPromiseError(error){
this.error = error;
};
exports.doStuff(arg1,arg2){
return new Promise(function (resolve, reject){
if (!error)
resolve({this: 'is', a: 'response'});
else
reject(error);
}});
在我的单元测试中,我有这样的测试:
mockedResponse = require('./fake/assertiveResponse.js');
mockedDependency = require('./fake/dependency.js');
it('should throw error',function(){
mockedDependency.setPromiseError(new Error('sorry, not today');
myLibUnderTest.myFunctionUnderTest(someFakeRequest,
mockedResponse.get()
.expectedStatus(200), <--I´m forcing a failing test here!
mockedDependency);
});
但是...我的断言似乎是承诺的http://rubular.com/而我通过此控制台输出得到了通过测试:
(node:1512) UnhandledPromiseRejectionWarning: Unhandled promise rejection
(rejection id: 2): AssertionError: 500 === 200
现在我甚至不确定我是否正确使用Promise ......任何帮助都表示赞赏。
答案 0 :(得分:0)
您应该将承诺视为代表您尚未拥有的数据的对象。
就我个人而言,我对promises的大部分经验来自于使用jQuery的$.ajax
方法,该方法实际上返回了自己的'promise'或'deferred'对象:
$.ajax({
url: "api.yourdomain.com/yourRoute",
success: function(data, textStatus, jqXHR){
//this is the success callback
},
error: function(jqXHR, textStatus, errorThrown){
//this is the error callback
}
});
现在,假设您需要拨打电话获取一些客户数据,并将该承诺传递给其他方法。再次,使用jQuery,您可以执行类似
的操作function getCustomerDataPromise(customerID){
return $.ajax({
url: "customerapi.yourdomain.com/customer/" + customerID,
success: function(data, textStatus, jqXHR){
//this is the success callback
},
error: function(jqXHR, textStatus, errorThrown){
//this is the error callback
}
});
}
function parseCustomerData(customerID){
var customerDataPromise = getCustomerDataPromise(customerID);
$.when(customerDataPromise).done(
function(customerDataResponse, responseText, responseObject){
//this is the success callback of the promise
}
);
关于$.when
的一个很酷的事情是,你实际上可以在那里传递多个承诺,并在它们全部完成后触发回调。
但是为了得到你原来的问题,你可以使用jQuery来模拟一个承诺,就像这样:
function makeMockedPromise(){
var dummyPromise = $.Deferred();
dummyPromise.resolve(
{
mockedKey: "Is this mocked data?",
mockedKeyTwo: "You bet it is! A mocked response"
}
);
return dummyPromise;
}
您可以在jQuery文档中详细了解这一点:http://api.jquery.com/
答案 1 :(得分:0)
不是非常熟悉Express,但看着你的代码,是不是只有一个错字?
我看到 this.expectedCode vs this.expectdCode
exports.expectedStatus = function(status){
this.expectedCode = status;
}
exports.status = function(realStatus){
this.expectdCode = realStatus;
return this;
答案 2 :(得分:0)
这完全是一个错字,我通过将我的断言移到一个单独的方法并使用sinon间谍确保它的调用来解决问题。然后使用settimeout确保在我的断言之前以最短的可接受时间执行所有操作。
可能不是最好的...但至少我的测试正在运行;) 谢谢你的帮助。