2014-09-13 108 views
0

我正在構建一個基於微風和角Breezejs單元測試與茉莉karma角

他們一起工作很好,但單元測試是一個問題。

這是一個相當香草測試,但微風狀態越來越中間:

describe('myController', function() { 

    beforeEach(inject(function ($injector) { 
     module('app'); 
     $httpBackend = $injector.get('$httpBackend'); 
     authRequestHandler = $httpBackend.whenGET().respond(200, 
      {"someStrings": ["foo", "bar"]}) 

     //more uninteresting code... 

     createController = function() { 
      return $controller('myController', { '$scope': $rootScope }); 
     }; 
    })); 

    it('should fetch authentication token', function() { 
     $httpBackend.expectGET('/auth.py'); 
     var controller = createController(); 
     $httpBackend.flush(); 
    }); 

的問題是,微風不斷被初始化。在執行時,我收到以下消息:

Error: cannot execute _executeQueryCore until metadataStore is populated. 

//or,with different get: ... $httpBackend.when('GET', '/auth.py') 
//         .respond({ userId: 'userX' }); 

Error: Unexpected request: GET breeze/Breeze/Metadata No more request expected 

如何防止或模擬或存根微風因此不與我的測試干涉......舉例來說,這些測試旨在認證,而不是數據。

回答

0

微風不是自己的「中間」。 Breeze不會參與您的$http授權調用。如果你能告訴我它的確如此,我會戴上我的帽子。你沒有證明它在這裏。

但是,您已經提出了一個關於應用程序引導程序設計以及該設計的測試結果的非常有趣的觀點。

很明顯,您的app模塊的啓動方法或您的控制器的創建邏輯執行Breeze查詢(也許他們都這樣做)。我推斷這兩個事實:

  1. 唯一的例外來自executeQueryCore當你明確地執行微風查詢

  2. 你不要觸摸控制器在您的測試,無論是在beforeEach也不只發生在it這意味着這些調用(以及您的身份驗證呼叫)是由某種自動啓動邏輯在您的it規範之前執行的。

在你的測試中,你花了很多時間來模擬auth調用(這在你的啓動邏輯中),但不是Breeze調用。

我不知道你究竟想要測試什麼。你爲什麼要測試控制器獲取授權令牌?這真的是管制員的顧慮嗎?

也許你提出這個測試僅僅是爲了說明你在測試控制器時沒有涉及真正的服務器的問題?

讓我退後一步,提出一個更重要,更一般的觀點。我們必須警惕自動啓動邏輯是否隱藏在應用程序模塊start或控制器的構造函數中。特別注意涉及到服務器調用的啓動邏輯。

我傾向於在我的測試中禁用自動啓動邏輯大多數。在調用ngMock的inject函數之前,我經常在我的測試模塊安裝過程中將測試雙打替換爲麻煩的依賴服務。我確信app.start方法的回調只使用易於僞造的依賴服務。你想用嘲諷的$httpBackend HTTP響應進取使用實際的依賴性

我,那麼你就必須爲準備$httpBackend每個請求接收從啓動代碼...包括請求你是用微風製作

我最後會重申,微風只做你告訴它做的事。它完全不知道您的直接撥打電話號碼爲$http