在Jasmine单元测试中,如何强制失败回调来触发失败请求
In a Jasmine unit test, how do I force a failure callback to trigger that would result from a failed request?
假设我有这个方法(下面是外推的函数):
function doSomething(onSuccess, onFailure){
var that = this;
that.$save(function(result){
if (onSuccess) {
onSuccess(result);
}
}, onFailure);
}
我已经成功地测试了onSuccess回调在该情况下是否会触发$save按预期执行,但我很难找到任何关于如何执行的文档$save无法触发onFailure回调。
我创建onFailure测试的尝试看起来像:
it ('should trigger the failure callback if necessary', function(){
var successCallback= jasmine.createSpy('successCallback');
var failureCallback= jasmine.createSpy('failureCallback');
// Force $save to fail to trigger failure callback
thing.$save = function(){};
spyOn(thing, '$save').and.throwError('thing.$save error');
thing.addNew(successCallback, failureCallback);
expect(failureCallback).toHaveBeenCalled();
expect(callback.successCallback).not.toHaveBeenCalled();
});
它仍然试图调用成功回调,因为我可以根据这个错误判断:
Expected spy failureCallback to have been called.
at /Users/pathy-path
Error: Unexpected request: POST http://website.com/things/5654d74a9b8d05030083239f
No more request expected
如果我设置httpBackend以期望POST(它不应该这样做,因为它应该失败?至少这看起来是合乎逻辑的),测试失败是因为执行了错误的回调:Expected spy failureCallback to have been called.
作为参考,我的onSuccess测试看起来是这样的(有些简化):
it ('should trigger the success callback', function(){
var successCallback = jasmine.createSpy('successCallback');
path = ENV.apiEndpoint + '/things/' + id;
// if this is triggered we know it would be saved
$httpBackend.expect('POST', path).respond(201);
thing.addNew(successCallback);
$httpBackend.flush();
expect(successCallback).toHaveBeenCalled();
});
您需要让它执行第二个(onFailure
)回调
spyOn(that, '$save').and.callFake(function(success, fail) {
fail();
});
我尝试了Phil的答案(这使测试通过),但觉得这实际上可能不是doSomething函数执行方式的真正测试。为了模仿API的失败,我最终使用$httpBackend并强制执行404响应,这样Angular的$save方法仍然执行:
it ('should trigger the failure callback if necessary', function(){
var successCallback= jasmine.createSpy('successCallback');
var failureCallback= jasmine.createSpy('failureCallback');
// Force $save to fail to trigger failure callback
path = ENV.apiEndpoint + '/things/' + thing.id;
$httpBackend.expect('POST', path).respond(404);
thing.addNew(successCallback, failureCallback);
$httpBackend.flush();
expect(failureCallback).toHaveBeenCalled();
expect(successCallback).not.toHaveBeenCalled();
});
相关文章:
- 当我的单元测试失败时,回调被调用了两次
- AJAX 回调在 Firefox 中失败
- 客户端如何知道发射是否失败?socket.emit()有回调吗
- 返回按钮回调函数在特定情况下失败或未启动
- ajax中的refrer函数名,失败时反向回调
- IE中的jQuery load()回调失败
- 咖啡脚本化的 ajax 调用结果在实际成功时失败回调
- 为什么 Ajax 请求成功,但最终以失败回调告终
- rsvp.js 如何处理被拒绝的承诺和失败回调链
- Corodva 文件读取执行成功和失败回调
- 语义 UI 在成功时,在表单验证时未触发失败回调
- .post()失败回调函数
- 在Jasmine单元测试中,如何强制失败回调来触发失败请求
- 虽然执行了Ajax请求,但调用了失败回调,服务器返回200个数据
- jquery.ajax究竟什么时候运行失败回调
- BreezeJS失败回调导致'undefined不是对象错误'例外
- jQuery ajax-只有在所有重试都失败时才触发失败回调函数
- Breeze entityManager调用失败回调,即使成功
- JQuery ajax()完成/失败回调在状态200时未返回
- jQuery.post() 失败回调函数