2015-02-26 2 views
0

Я пытаюсь научиться тестировать блок в угловом режиме. Модуль тестирует мои контроллеры, чтобы начать с моих услуг.AnglearJS Unit Test - Undefined не является функцией

Я начал с базового теста.

контроллер код:

angular.module('app') 
    .controller('TestCtrl', function ($rootScope,$scope,fileLoader,ngProgress) { 
$scope.test= []; 
    $scope.init = function(){ 
     fileLoader.getFile("test") 
     .then(function(res){ 
      //Success 
      console.log(res); 
      $scope.test= res; 
     }, function(err){ 
      //Error 
     }); 

     ngProgress.complete(); 
    } 

    $scope.init(); 
$scope.title = "Test"; 
    }); 

Код испытания:

describe('Controller: TestCtrl', function() { 

    // load the controller's module 
    beforeEach(module('app')); 

    var TestCtrl, 
    scope,test; 
    test = {}; 
    test.getFile = function(name) { 
    return [ 
     { 
     "id": 0, 
     "name": "Test", 
     "imgName": "Test.png" 
     }, 
     { 
     "id": 1, 
     "name": "Test1", 
     "imgName": "Test1.png" 
     }]; 
    }; 


    // Initialize the controller and a mock scope 
    beforeEach(inject(function ($controller, $rootScope) { 
    scope = $rootScope.$new(); 
    TestCtrl= $controller('TestCtrl', { 
     $scope: scope, 
     fileLoader : test 
    }); 
    })); 

    it('should have the correct title', function() { 
    expect(scope.title).toBe("Test"); 
    }); 
}); 

И я не могу понять, почему я получаю следующее сообщение об ошибке:

TypeError: 'undefined' is not a function (evaluating 'fileLoader.getFile("test") .then') undefined

Есть ли способ, как только это разрешено. Я могу отложить все мои издевательства в отдельном файле, например мой fileLoader макет и просто вводить его таким образом?

Я не понимаю, как я его впрыскиваю, но пока не определено.

Благодаря

ответ

3

And I can't understand why I am getting the following error:

вы определили

fileLoader.getFile("test") 
    .then(function(res){ 

так GetFile() должен возвращать обещание, которое может быть решена, но вы возвращаете простой массив с двумя объектами внутри

test.getFile = function(name) { 
    return [ 
    { 
    "id": 0, 
    "name": "Test", 
    "imgName": "Test.png" 
    }, 
    { 
    "id": 1, 
    "name": "Test1", 
    "imgName": "Test1.png" 
    }] 

рефакторинг одна сторона. Используйте defers или обрабатывайте результат массива.

+0

Как я мог бы выполнить обещание на стороне тестирования устройства? – LmC

+0

Несомненно, это все равно показало, что я возвращаю что-то просто не так? – LmC

+0

вы вызываете «then» после getFile() ... «then» не определено, потому что getFile() возвратил массив ... undefined не является функцией. для «defer» взгляните на угловые $ q [здесь ] (https://docs.angularjs.org/api/ng/service/$q#testing) – capgeti

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