为了检查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);
}
}
最佳答案
您的测试说“应该调用backendController.submitRequest1”,因此您只关心要调用的方法。因此,只要不要andCallThrough()
,您就不会有麻烦。
更新资料
也许您必须在Submit事件中preventDefault()
这样:
spyOn(backendController, 'submitRequest1').andCallFake(function(e) { e.preventDefault(); });
更新2
在检查完其余代码之后,您已经添加了一个问题,我仍然建议您尽快停止执行代码。直到测试到达,直到
backendController.submitRequest1()
被调用。在这种情况下,使用方法中的简单模拟是不够的,因为随后将使用此方法的返回,因此您的模拟应遵循此原则:
// code no tested
var fakeFunction = function(){
this.done = function(){ return this };
this.fail = function(){ return this };
return this;
}
spyOn(backendController, 'submitRequest1').andCallFake( fakeFunction );
当事情开始变得如此复杂而难以测试时,便是一种症状,也许它们可以组织得更好。
关于javascript - 假Ajax请求,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12070152/