为了检查提交ajax请求,当用户提交表单时,我使用jasmine(1)实现了以下测试。
测试成功通过但是查看javascript控制台我收到以下错误500 (Internal Server Error)
。
由于我不关心服务器响应,我的问题是:
1)我应该或不应该关心这个错误
2)伪造ajax请求以避免Internal Server Error
会更好吗?如果是的话,在我的背景下怎么样?
(1)
define([
'backendController'
], function (backendController) {
// some code
describe('When button handler fired', function () {
beforeEach(function () {
spyOn(backendController, 'submitRequest1').andCallThrough();
this.view = new MyView({
el: $('<div><form><input type="submit" value="Submit" /></form></div>')
});
this.view.$el.find('form').submit();
});
it('backendController.submitRequest1 should be called', function () {
expect(backendController.submitRequest1).toHaveBeenCalled();
});
});
});
(2)
// backendController object
return {
submitRequest1: function (message) {
return $.ajax({
url: 'someUrl',
type: 'POST',
dataType: 'json',
data: {
message: message
}
}).done(function () {
// some code
});
}
}
(3)
// submitForm in MyView
submitForm: function (event) {
event.preventDefault();
var formElement = event.currentTarget;
if (formElement.checkValidity && !formElement.checkValidity()) {
this.onError();
} else {
backendController. submitRequest1('some data').done(this.onSuccess).fail(this.onError);
}
}
答案 0 :(得分:1)
你的测试说“应该调用backendController.submitRequest1”,所以你只关心要调用的方法。所以,不要andCallThrough()
,你就没有麻烦。
也许你必须在提交活动中<{1}} 所以:
preventDefault()
在检查了剩下的代码后,您已经添加了问题,我仍然建议尽快停止代码执行。直到测试到达,这仍然是spyOn(backendController, 'submitRequest1').andCallFake(function(e) { e.preventDefault(); });
被调用。
在这种情况下,方法中的 mock 是不够的,因为随后会使用此方法的 return ,而 mock 应该尊重这一点:
backendController.submitRequest1()
当事情开始如此复杂以至于测试是一种可能更好地组织起来的症状。