Angular Js - 使用Jasmine返回对象的测试POST请求

时间:2014-09-29 11:07:13

标签: ajax angularjs jasmine karma-jasmine

我有一个服务设置,可以进行所有的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...

1 个答案:

答案 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()将抛出一个错误,因为预期的调用没有发生。该错误将导致您的测试失败。