2014-09-29 51 views
2

我有一个服务设置,它使我所有的AJAX调用。我想测试我的登录方法,该方法将AJAX POST $http.post发送到特定的URL,该URL返回结果(登录通过或失败)的对象。这个结果是一个对象。我没有完全返回代码来测试服务,但我试图首先测试URL。这是它现在的样子:Angular Js - 用Jasmine返回一个对象的测试POST请求

'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,错误的用户名/密码,但它仍然通过!我如何测试这个?

UPDATE: 写得现在:

//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

你需要把一个

httpBackend.flush(); 

将抛出一个异常,如果预期网址未被调用 - 从而无法通过测试。

另外,我看不到你在调用flush()之前调用的是执行Ajax请求的代码。

因此,像:

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(...)行的网址,一切都会好的。如果它不会httpBackend.flush()会抛出一个错误,因为预期的调用没有发生。该错误将导致您的测试失败。

+0

我正在更新我的问题并添加我得到的响应。请检查一下! – 2014-09-29 11:30:15

+0

另外,'httpBackend.expect(...)'这个AJAX调用是否正确? – 2014-09-29 11:33:26

+0

不,httpBackend.expect(...)不会执行调用 - 它告诉httpBackend期待一个调用。 httpBackend.flush()然后处理所有的调用。在这两件事之间的某处,您需要调用执行ajax请求的函数。 – Fordio 2014-09-29 11:37:00