2015-06-15 70 views
0

爲了測試我的控制器,我使用$ q注射器嘲笑了一些服務。這些會在適當的情況下拒絕或解決承諾。我的測試依靠間諜來監視函數是否被調用。茉莉花在呼叫之後解決承諾,但在此之前預計

我發現我需要調用$ rootScope $ digest(),如果在函數調用後將它包含在測試中,它會起作用,但它是多餘的,我恐怕在測試中可能會忘記它有時。

如果我嘗試將摘要調用移至afterEach,則承諾實際上並未解決!

嘗試使用以下,其嵌套在所述測試的父與所有我的beforeEachs的:

afterEach(function() { 
    $rootScope.$apply(); 
}); 

然後我的測試,其中在描述中相同的範圍作爲我的前/ afterEachs:

it("on return success from personService.add, state.go called", function() { 
      $scope.addPerson(true); 
      expect($state.go).toHaveBeenCalled(); 
     }); 

如果我像上面那樣運行,則不調用該函數。但是,如果我在調用addPerson之後添加$ rootScope。$ digest(),則會調用它!

1)我怎樣才能在全球範圍的函數調用後,但我希望

回答

1

eachafterEach/beforeEach之前解決的承諾是指it方法。這意味着你不能指望調用it部分的函數,消化afterEach中的作用域,並仍然使用it方法中的expect

如果你害怕,你會忘了運行摘要你可以包裹在規範中的一個私人的功能,將照顧它爲你的函數調用,這樣的事情:

describe(...., function() { 
    .... 
    function doAct(func) { 
     if (typeof func === "Function") { 
      func(); 
      $rootScope.$digest(); 
     } 
    } 

    // it methods here 
}); 

而且只需一個包裝呼籲那些特定規格的測試:

it("on return success from personService.add, state.go called", function() { 
     doAct(function() { 
      $scope.addPerson(true); 
     }); 
     expect($state.go).toHaveBeenCalled(); 
}); 

我必須說,我不認爲這是很大的開銷做消化打電話來,你可能有什麼我更麻煩如果其他程序員在不瞭解它的作用的情況下接受你的代碼,那麼上面的代碼就暗示了上面的內容ES。

+0

感謝@Omri,因爲我在Google搜索中沒有找到更好的答案我不得不接受你是正確的:)我同意,只是將摘要內聯比包裝更乾淨,所以我會堅持接着就,隨即。謝謝 –

+0

@JoshuaOhana聽起來不錯:) –

相關問題