2015-10-11 58 views
0

已经在业力,摩卡柴和sinon试过一个测试用例。角度测试类型错误

一旦我使用该服务,我会收到错误信息。这是我的错误。请任何帮助。

AssertionError: expected undefined to deeply equal 'strong' 
     at /var/www/html/Testing/mocha/node_modules/chai/chai.js:210 
     at assertEql (/var/www/html/Testing/mocha/node_modules/chai/chai.js:784) 
     at /var/www/html/Testing/mocha/node_modules/chai/chai.js:3854 
     at /var/www/html/Testing/mocha/www/index-controller.test.js:22 
PhantomJS 1.9.8 (Linux 0.0.0): Executed 1 of 1 (1 FAILED) ERROR (0.043 secs/0.002 secs) 

这是我indexcontroller.js

'use strict'; 

angular.module('beatso.index-controller', []) 
    .controller('IndexController', function(
     commanService) { 
     (function(vm){ 
      angular.extend(vm, { 
       checkPassword: checkPassword 
      }) 

      vm.headingTop = "Beatso A Music Fanatic Group"; 
      vm.password = "verystrogpassword"; 
      function checkPassword() { 
       return commanService.passwordValidator("vm.password"); 
      } 
     })(this); 
    }); 

这是我的IndexController测试。 indeccontroller.test.js

​​

这是我常用的服务

'use strict'; 

    angular.module('beatso-comman.service', []) 
     .factory('commanService', function(){ 
      var service = { 
       passwordValidator: passwordValidator 
      } 

      function passwordValidator(password){ 
       if(password.length >= 8) { 
        return 'strong' 
       }else { 
        return 'weak' 
       } 
      } 
      return service; 
     }) 

这里是我的服务测试。

'use strict' 

    describe('Test for my comman service', function(){ 

     var cService; 

     beforeEach(module('beatso-comman.service')); 
     beforeEach(inject(initCommanService)); 

     it('It should check the password strength', function(){ 
      expect(cService.passwordValidator('amtoverystrongpassword')).to.eql('strong'); 
     }); 

     function initCommanService(commanService){ 
      cService = commanService; 
     } 
    }) 
+0

顺便说一句,删除引号'passwordValidator( “vm.password”)',只要你想检查*值* vm.password'的'。 –

+0

谢谢@ MichaelP.Bazos但是我的问题还没有解决。你能帮我么。 –

+0

我知道这不是''undefined'不是函数'的原因。你的主要问题是你想用一个模拟服务来测试服务方法,它没有方法。 –

回答

1

您的commanService mock没有方法“passwordValidator”,因此试图调用它会引发“未定义”错误。

如果你想测试你的服务,你不应该嘲笑它,但实际上真的测试它。您可以通过注入它来获得对您的服务的引用(请参阅Jasmine中的inject()函数)。

下面是一段代码,从我的项目之一:

// inject the service itself 
beforeEach(inject(function(nfcService){ 
    service = nfcService; 
})); 

哪里,显然,“服务”是我用来执行我的单元测试(和真正考验我的服务)的变量。

编辑 - 细节: 我的意思是,你的控制器的测试不应该测试你的服务...你的控制器的测试应该测试你的控制器。它最终应该使用你的服务的模拟(在想要的方法上使用间谍),检查是否调用了合适的方法。

例如:

myServiceMock = { 
    expectedMethod: jasmine.createSpy('expectedMethod spy') 
} 

并在测试:

expect(myServiceMock.expectedMethod).toHaveBeenCalled(); 

当实例与$controller控制器,你可以通过它(在第二个参数)的对象字面提供其依赖关系。这样,你可以给它一个你想要的模拟。

一个例子,还是从我的项目:

menuCtrl = $controller('MenuController', { 
     // where 'uiFeedbackService' is the name of the dependency 
     'uiFeedbackService': uiFeedbackServiceMock 
    }); 

注:关于你的服务,你可以直接return的文字,而不是创建一个变量,声明一个私有函数对象的声明( passwordValidator),然后返回该变量。

angular.module('beatso-comman.service', []) 
.factory('commanService', function(){ 
    return { 
     passwordValidator: function(password){ 
      if(password.length >= 8) { 
       return 'strong' 
      }else { 
       return 'weak' 
      } 
     } 
    } 
}) 
+0

嗨,谢谢,已更新我的代码。你能检查一下吗? –

+0

嗨。这次你有“未定义”,因为你的indexController没有所需的方法(checkPassword)。你是如何以这种方式使用inject()的? (调用另一个函数,'initIndexController' ??) – VinceOPS