这是关于javascript提交请求的代码(1)。
下面是使用jasmine(2)模拟ajax请求的测试。
我想模拟服务器行为。有什么想法吗?
有关详细信息,请参阅 (1) 和 (2) 中的注释。
附言:
实际上,在这两种情况下,都会调用 fakeFunction 的完成和失败延迟对象。
(1)
submitForm: function () {
// the server execute fail only if message.val() is empty
// and I would like to mock this behaviour in (2)
backendController.submitForm(message.val()).done(this.onSuccess).fail(this.onError);
},
backendController.submitForm = function (message) {
return $.ajax({
url: 'some url',
type: 'POST',
dataType: 'json',
data: {
message: message
}
}).done(function () {
//some code;
});
};
(2)
describe('When Submit button handler fired', function () {
var submitFormSpy,
fakeFunction = function () {
this.done = function () {
return this;
};
this.fail = function () {
return this;
};
return this;
};
beforeEach(function () {
submitFormSpy = spyOn(backendController, 'submitForm').andCallFake(fakeFunction);
});
describe('if the message is empty', function () {
beforeEach(function () {
this.view.$el.find('#message').text('');
this.view.$el.find('form').submit();
});
it('backendController.submitForm and fail Deferred Object should be called', function () {
expect(submitFormSpy).toHaveBeenCalled();
// how should I test that fail Deferred Object is called?
});
});
describe('if the message is not empty', function () {
beforeEach(function () {
this.view.$el.find('#message').text('some text');
this.view.$el.find('form').submit();
});
it('backendController.submitForm should be called and the fail Deferred Object should be not called', function () {
expect(submitFormSpy).toHaveBeenCalled();
// how should I test that fail Deferred Object is not called?
});
});
});
最佳答案
我们实际上遇到了同样的问题,试图测试代表 AJAXed 模板脚本的延迟对象以进行即时模板化。我们的测试解决方案涉及使用 Jasmine-Ajax库与 Jasmine 本身结合。
所以可能会是这样的:
describe('When Submit button handler fired', function () {
jasmine.Ajax.useMock();
describe('if the message is empty', function () {
beforeEach(function() {
spyOn(backendController, 'submitForm').andCallThrough();
// replace with wherever your callbacks are defined
spyOn(this, 'onSuccess');
spyOn(this, 'onFailure');
this.view.$el.find('#message').text('');
this.view.$el.find('form').submit();
});
it('backendController.submitForm and fail Deferred Object should be called', function () {
expect(backendController.submitForm).toHaveBeenCalledWith('');
mostRecentAjaxRequest().response({
status: 500, // or whatever response code you want
responseText: ''
});
expect( this.onSuccess ).not.toHaveBeenCalled();
expect( this.onFailure ).toHaveBeenCalled();
});
});
另一件事,如果可以的话,尝试分解功能,这样您就不会在一次测试中测试整个 DOM-to-response-callback 路径。如果您足够精细,您实际上可以通过在测试中使用延迟对象本身来测试异步延迟解决方案!
关键是在你的测试中实际使用 Deferred 对象,这样 expect
调用的范围仍然在你的 it
函数 block 中。
describe('loadTemplate', function() {
it('passes back the response text', function() {
jasmine.Ajax.mock();
loadTemplate('template-request').done(function(response) {
expect(response).toBe('foobar');
});
mostRecentAjaxRequest().response({ status:200, responseText:'foobar' });
});
});
关于javascript - 如何使用 Jasmine 测试完成和失败的延迟对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12073622/