2015-04-03 84 views
0

我對angular/jasmine/karma非常陌生,而且我無法爲我的控制器寫一個測試。測試本身運行成功,但在試運行,我發現了以下錯誤:試圖用茉莉花來測試一個角度控制器 - 錯誤

Error: userFactory() method does not exist 

userFactory()是在我的控制器作出返回一個承諾的服務的方法調用。我不確定如何確保在測試中正確定義了這一點。

這裏是我的代碼:

app.js

(function() { 
    angular.module('mdotTamcCouncil', ['mdotTamcCouncil.core', 'blurb']); 

    angular.module('mdotTamcCouncil.core', []); 
})(); 

Blurb的-service.js

(function() { 
    angular.module('mdotTamcCouncil.core').factory('blurbsFactory', function ($http) { 
     var promise = null; 

     return function() { 
      if (promise) { 
       // If we've already asked for this data once, 
       // return the promise that already exists. 
       return promise; 
      } else { 
       promise = $http.get(jsGlobals.blurbsDataURL); 
       return promise; 
      } 
     }; 
    }); 
})(); 

用戶service.js

(function() { 
    angular.module('mdotTamcCouncil.core').factory('userFactory', function ($http) { 
     var promise = null; 

     return function() { 
      if (promise) { 
       // If we've already asked for this data once, 
       // return the promise that already exists. 
       return promise; 
      } else { 
       promise = $http.get(jsGlobals.userDataURL); 
       return promise; 
      } 
     }; 
    }); 
})(); 

Blurb的-controller.js

(function() { 
    angular.module('blurb') 
      .controller('BlurbController', ['$scope', 'blurbsFactory', 'userFactory', function ($scope, blurbsFactory, userFactory) { 
       $scope.content = ""; 
       $scope.blurbs = {}; 
       $scope.currentUser = {}; 
       this.editMode = false; 


       userFactory().success(function (data) { 
        $scope.currentUser = data; 
       }); 

       blurbsFactory().success(function (data) { 
        $scope.blurbs = data; 
        $scope.content = $scope.blurbs[$scope.textKey]; 
       }); 

       this.enterEditMode = function() { 
        this.editMode = true; 
       }; 

       this.saveEdits = function() { 
        this.editMode = false; 
        $scope.blurbs[$scope.textKey] = $scope.content; 
       }; 
      }]); 

})(); 

Blurb的-module.js

(function() { 
    'use strict'; 
    angular.module('blurb', ['ngSanitize', 'mdotTamcCouncil.core']); 

})(); 

和我的測試規範:

describe('BlurbController', function() { 
    var scope, controllerService; 

    beforeEach(module('mdotTamcCouncil')); 
    beforeEach(module('mdotTamcCouncil.core')); 
    beforeEach(module('blurb')); 

    beforeEach(inject(function ($rootScope, $controller) { 
     scope = $rootScope.$new(); 
     controllerService = $controller; 
    })); 

    it("should get 'user' from 'data/user.json'", inject(function ($httpBackend) { 
     $httpBackend.expectGET("data/user.json").respond({"userName": "myera","email": "[email protected]","isAdmin": true}); 
     $httpBackend.expectGET("data/blurbs.json").respond('{"mainPageIntro": "<h2>Welcome</h2>"}'); 
     ctrl = controllerService('BlurbController', { $scope: scope }); 
     $httpBackend.flush(); 
     expect(scope.currentUser).toEqual({"userName": "myera","email": "[email protected]","isAdmin": true}); 
     expect(scope.blurbs).toEqual({ "mainPageIntro": "<h2>Welcome</h2>" }); 
    })); 
}); 

我這個拼湊一起閱讀博客和sta ckoverflow的答案。我不確定我是否做得正確。

測試本身實際上已通過,但我在控制檯中發現有關缺少「userFactory()」方法的錯誤。我假設我也會得到「blurbFactory()」方法的消息。我不相信我可以在沒有首先解決這些錯誤的情況下測試控制器的實際功能。

我在做什麼錯?非常感謝您提供的任何幫助。

回答

0

我相信你看到的問題是因爲你沒有在blurb模塊中包含'mdotTamcCouncil.core'模塊作爲依賴項。當定義它,你應該使用

angular.module('blurb', ['mdotTamcCouncil.core']); 

因爲執行時userFactory()失敗阻止你只得到了一個控制檯錯誤能夠在依賴列表來傳遞。我不確定爲什麼測試顯示爲傳球,它應該拿起例外並失敗 - 對於您選擇的測試跑步者來說可能是一個怪事。

+0

非常感謝您的反饋,@ Travis。不幸的是,我的blurb模塊中定義了「mdotTamcCouncil.core」。我已更新我的問題以顯示blurb-module.js的內容。再次感謝! – 2015-04-03 13:58:39

+0

不幸的是我不確定我會得到更多的幫助。我將你的樣本插入到一個快速測試項目中,我碰到的唯一問題是blurb模塊沒有正確加載。我通過改變模塊的創建方式解決了這個問題。本質上,我刪除了blurb模塊文件並更新了blurb控制器以在那裏實例化模塊。一旦這個問題得到解決,測試就會運行並且不會出現控制檯錯誤。 – Travis 2015-04-03 14:39:38

+0

謝謝你噸!我在模塊聲明的製作地點玩弄了一下,最終讓它工作。我想知道如果我的業力測試跑步者沒有正確加載blurb-module.js。修改karma配置後,我重新啓動它,然後運行。儘管你讓我走上正軌。謝謝。 =) – 2015-04-03 14:51:53