AngularJS,Mocha,Chai:使用promises

时间:2015-10-23 11:44:22

标签: angularjs testing mocha karma-runner chai

我发现有几篇帖子将此代码显示为执行异步单元测试的方法:

服务:

angular.module('miservices', [])
.service('myAppServices', ['$http', 'httpcalls', function($http, httpcalls) {
    this.getAccountType = function(){
        return httpcalls.doGet('http://localhost:3010/...').then(function(data){
            return data;
        }, function(error){
            ...
        });
    };
    ...

测试:

describe('testing myAppServices', function(){

beforeEach(module('smsApp'));
it('should handle names correctly', inject(function(myAppServices){
  myAppServices.getAccountType()
  .then(function(data) {
      expect(data).equal({...});
});
...

我们正在使用AngularJS,Mocha,Chai,我们安装了Sinon。

测试永远不会进入.then部分,但为什么?

谢谢!

1 个答案:

答案 0 :(得分:0)

如果您正在测试您的服务,我建议您模拟您的“httpcalls”服务(因为这是在此测试范围之外)。

要模拟它,您可以有多种方法,一种方法是使用仅用于单元测试的模拟模块。

 angular.module('miservices.mocks', [])
.service('httpcalls', ['$q', function($q) {
    this.returnGet = '';
    this.doGet = function(url) {
           return $q.when(this.returnGet);
        };
    };

然后你的单元测试会是这样的:

describe('testing myAppServices', function(){

beforeEach(function() {
module('smsApp');
module('miservices.mocks');
});
it('should handle names correctly', inject(function(myAppServices, httpcalls){
  httpcalls.returnGet = 'return data';
  myAppServices.getAccountType()
  .then(function(data) {
      expect(data).equal('return data');
});
...

因为我们在应用程序模块之后插入了mocks模块,所以httpcalls服务被其模拟版本覆盖,并允许我们在没有进一步依赖的情况下正确测试myAppServices。