2015-07-28 2 views
0

Я пытаюсь выполнить тестирование контроллера. Это мой контроллер:Как избежать ошибок при модульном тестировании контроллера?

app.factory('myService', function ($q) { 
    var callMe = function (user) { 
     var pr = $q.defer(); 
     pr.resolve('Hello ' + user); 
     return pr.promise; 

     //$timeout(function(){ 
     // pr.resolve('Hello ' + user); 
     // return pr.promise; 
     //},4000); 

    } 
    return {callMe: callMe}; 
}); 



app.controller('myCtrl',function($scope,myService){ 
    $scope.callService = function(){ 
     $scope.callMeValue = myService.callMe('lo'); 
    } 
}) 

Это мой тест:

beforeEach(
    inject(function (_$rootScope_, $controller, _myService_, _myServiceTimeout_,$q) { 
    myService = _myService_; 
    myServiceTimeout = _myServiceTimeout_; 
    $scope = _$rootScope_.$new(); 

    ctrl = $controller('myCtrl', { 
     $scope: $scope, 
     someService: someServiceMock 
    }); 

    someServiceMock.callMe.andReturn($q.when('Ted')); 
})); 


it('ctrl test', function() { 
    $scope.callService(); 
    expect(myService.callMe).toHaveBeenCalled(); 
}); 

Вот ошибки я получаю:

TypeError: someServiceMock.callMe.andReturn is not a function 

и:

Error: Expected a spy, but got Function. 

Как может Я это исправить?

plunkr: http://plnkr.co/edit/EM1blTOlg5fw5wq6OFcr?p=preview

ответ

1

Ваш пример содержит несколько ошибок.

  1. Если вы используете тайм-аут в коде, в тесте вы должны использовать $ timeout.flush() (Scope. $ Применять не достаточно)
  2. $ таймаут обещание, вам не нужно создавать собственное обещание
  3. $ таймаут обещание, вы должны вернуть его

    app.factory('myServiceTimeout', function ($timeout) { 
        var callMe = function (user) { 
         return $timeout(function(){ 
          return 'Hello ' + user; 
         },4000); 
    
        } 
        return {callMe: callMe}; 
    }); 
    
    
    it('test2',function(){ 
        var result; 
        myServiceTimeout.callMe('Ruud').then(function(ret) 
        { 
         result = ret; 
        }); 
    
        $timeout.flush() 
        expect(result).toBe('Hello Ruud'); 
    }); 
    

весь Exemple: http://plnkr.co/edit/cqzTYwfs94Xqyz5MTxeE?p=preview

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