2015-06-30 38 views
1

我试图单元测试一个使用$http服务发出http请求的方法,但$httpbackend模拟似乎不会拦截请求 - 我得到一个Error: No pending request to flush !错误。

我的测试如下:

/// <reference path="../typings/tsd.d.ts" /> 
/// <reference path="../dist/ngJwtAuth.d.ts" /> 


var expect = chai.expect; 

describe('Service tests',() => { 

    var $httpBackend:ng.IHttpBackendService; 
    var ngJwtAuthService:NgJwtAuth.NgJwtAuthService; 

    beforeEach(()=>{ 

     module('ngJwtAuth'); 

     inject((_$httpBackend_, _ngJwtAuthService_) => { 
      $httpBackend = _$httpBackend_; 

      if (!ngJwtAuthService){ //dont rebind, so each test gets the singleton 
       ngJwtAuthService = _ngJwtAuthService_; //register injected of service provider 
      } 
     }) 
    }); 

    afterEach(() => { 
     $httpBackend.verifyNoOutstandingExpectation(); 
     $httpBackend.verifyNoOutstandingRequest(); 
    }); 

    it('should be an injectable service',() => { 

     return expect(ngJwtAuthService).to.be.an('object'); 
    }); 

    it('should retrieve a json web token',() => { 

     var user = { 
      email: '[email protected]', 
      password: 'password' 
     }; 

     $httpBackend.expectGET('/api/auth/login', (headers) => { 
      return headers['Authorization'] == 'Basic '+btoa(user.email+':'+user.password); 
     }); 

     var promisedToken = ngJwtAuthService.authenticate(user.email, user.password); 

     promisedToken.then((res) => { 

      console.log('res', res); 
     }); 

     $httpBackend.flush(); 

    }); 


}); 

我得到的结果是

Start: 
    Service tests 
    ✔ should be an injectable service 
    ✖ should retrieve a json web token 
    ✖ "after each" hook 

Finished in 0.055 secs/0.004 secs 

SUMMARY: 
✔ 1 tests completed 
✖ 2 tests failed 

FAILED TESTS: 
    Service tests 
    ✖ should retrieve a json web token 
     Chrome 43.0.2357 (Mac OS X 10.10.3) 
    Error: No pending request to flush ! 
     at Context.<anonymous> (base/test/tmp/test.js?7ade37b85a3e515024b3ce23ba6d9fc4c70ddcc2:104:22) 

    ✖ "after each" hook 
     Chrome 43.0.2357 (Mac OS X 10.10.3) 
    Error: Unsatisfied requests: GET /api/auth/login 
     at Context.<anonymous> (base/test/tmp/test.js?7ade37b85a3e515024b3ce23ba6d9fc4c70ddcc2:86:22) 

,我测试的是

public authenticate(username:string, password:string): ng.IPromise<Object>{ 

    var authHeader = NgJwtAuthService.getAuthHeader(username, password); 

    var requestConfig:ng.IRequestConfig = { 
     method: 'GET', 
     url: this.getLoginEndpoint(), 
     headers: { 
      Authorization : authHeader 
     }, 
     responseType: 'json' 
    }; 

    return this.$http(requestConfig); 
} 

整个项目可以发现问题的方法在https://github.com/spira/angular-jwt-auth

回答

1

好的,我在玩了一段时间之后就解决了它。原来的解决方案是确保$httpbackend没有为每个函数重新声明。这看起来是这样的:

inject((_$httpBackend_, _ngJwtAuthService_) => { 

    if (!ngJwtAuthService){ //dont rebind, so each test gets the singleton 
     $httpBackend = _$httpBackend_; 
     ngJwtAuthService = _ngJwtAuthService_; //register injected of service provider 
    } 
}) 

,因为我想每个测试使用相同的服务(该服务是可变的),我必须包括如果块内的$httpBackend = _$httpBackend_;线。