2015-10-11 2 views
0

Попробовали тестовый корпус в карме, мокко-чаи и силоне.Угловое испытание Тип Ошибка

Я получаю сообщение об ошибке после использования службы. Это моя ошибка. Пожалуйста, помогите.

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

describe('Index Controller', function() { 
    var indexController; 
    var commanServiceMock; 
    var commanService; 

    beforeEach(module('beatso.index-controller')); 
    beforeEach(module(initMocks)); 
    beforeEach(inject(initIndexController)); 

    it('should return strong if password length is greater than equal to 8', function() { 

     expect(indexController.checkPassword()).to.eql('strong');    
     expect(commanServiceMock.passwordValidator.calledOnce).to.eql(true); 

    }); 


    function initMocks ($provide){ 


     commanServiceMock = { 
      passwordValidator: sinon.spy() 
     }; 
     $provide.service('commanService', function(){ 
      return commanServiceMock; 
     }) 
    } 

    function initIndexController($controller) { 
     indexController = $controller('IndexController'); 
    } 
}); 

Это моя общая служба

'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

Btw, удалить кавычки в 'passwordValidator ("vm.password")', как вы хотите, чтобы проверить значение * * из 'vm.password'. –

+0

Спасибо @ MichaelP.Bazos Но моя проблема еще не решена. Не могли бы вы мне помочь. –

+0

Я знаю, что это не причина '' undefined '' не является функцией'. Основная проблема заключается в том, что вы хотите протестировать метод службы с помощью посмешиваемой службы, у которой нет метода. –

ответ

1

Ваш commanService макет не имеет метод «passwordValidator», таким образом пытаясь назвать его поднять «неопределенное» ошибка.

Если вы хотите протестировать свое обслуживание, вам не следует издеваться над ним, но на самом деле его действительно проверить. Вы можете получить ссылку на свою услугу, введя ее (см. Функцию inject() в Jasmine).

Вот кусок кода из одного моего проекта:

// 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). Как вы пришли использовать инъекцию() таким образом? (Вызов другой функции, 'initIndexController' ??) – VinceOPS

Смежные вопросы