我有一个服务设置,可以进行所有的AJAX调用。我想测试我的登录方法,该方法将AJAX POST $http.post
发送到特定的URL,该URL返回带有结果的对象(登录已通过或失败)。这个结果是一个对象。我没有准确地返回代码来测试服务,但我正在尝试首先测试URL。这就是它现在的样子:
'use strict';
describe('Service: Ajax', function () {
var service, httpBackend;
// load the service's module
beforeEach(module('mySampleApp'));
// instantiate service
beforeEach(inject(function (Ajax, _$httpBackend_) {
httpBackend = _$httpBackend_;
service = Ajax;
}));
it('Test AJAX call', function () {
httpBackend.expect('POST', 'http://myloginurl', {u: 'xyz', p: 'pass'}, { withCredentials: true})
.respond(201, 'success');
});
});
这过去了。现在我尝试使用错误的URL,错误的用户名/密码,但它仍然通过!我该如何测试?
更新: 现在更好写:
//Ajax is my AJAX service
it('should test the login AJAX call', inject(function (Ajax) {
httpBackend.expect('POST', 'http://myloginurl')
.respond(200, "[{ status: 200, //some more data }]");
httpBackend.flush();
Ajax.authenticate({u: 'xyz', password: 'pass' })
.then(function(data){
expect(data.status).toBe(200);
});
}));
我明白了:
PhantomJS 1.9.7 (Linux) Service: Ajax should test the login AJAX call FAILED
Error: No pending request to flush !
blah blah...
答案 0 :(得分:1)
你需要放一个
httpBackend.flush();
如果未调用预期的网址,那么会抛出异常 - 从而导致测试失败。
另外,我无法看到您在任何地方调用执行Ajax请求的代码 - 您需要在调用flush()之前执行此操作。
类似于:
it('Test AJAX call', function () {
httpBackend.expect('POST', 'http://myloginurl', {u: 'xyz', p: 'pass'}, { withCredentials: true})
.respond(201, 'success');
service.functionThatMakesCallToServer();
httpBackend.flush();
});
如果functionThatMakesCallToServer()调用httpBackend.expect(...)行中的url,一切都会正常。如果它没有httpBackend.flush()将抛出一个错误,因为预期的调用没有发生。该错误将导致您的测试失败。