2017-02-21 11 views
1

角度アプリケーションに次のコントローラがあります。

m = angular.module "myapp.dashboards" 

    m.directive "lkDashboardElement", (
     $timeout 
     MyAppSettings 
    )-> 

     scope: 
     dashboard: "=" 
     element: "=" 
     dashboardController: "=" 
     elementLoaded: "&" 

     link: ($scope, $el)-> 

     if MyAppSettings.shouldCalculateTableWidth 

      document.addEventListener "dashboard.element.rendered", => 

      $timeout(-> 
       .. 
       .. 
      ) 

重要な部分だけが表示されるように、たくさんのものを削除します。私が問題を抱えているのは、角の使用方法である$timeoutです。私は現在、特定の条件shouldCalculateTableWidthをチェックしています。イベントが発生した場合は、すぐにタイムアウトします。

現在、$timeoutが使用されているかどうかをチェックする単体テストを作成しようとしています。

describe "in a phantomjs context", -> 
    beforeEach -> 
    # This sets our Phantom rendering context to true for testing purposes 
    MyAppSettings._setIsPhantomRendering(true) 

    afterEach -> 
    MyAppSettings._setIsPhantomRendering(false) 

    it "uses $timeout (instead of applyAsync) for adjusting table widths", -> 
    # Creates a dummy dashboard 
    dashboardController.queryMap = {1: {view: "foo", model: "bar"}} 
    dashboard.elements = [{id: 1}] 
    spyOn($timeout, "flush") 
    expect($timeout.flush).toHaveBeenCalled() 

私はそれが重要であるため、単に$timeoutは、コードのこの部分で使用されているかどうかをテストされてやろうとしています私は午前たときにどのようにレンダリングされるか、特定の画像へ:ここ

は私のテストですファントム(イメージレンダリングライブラリ)コンテキスト。私は、テストを実行すると、私は次のエラーを取得する:私が持っている特定の問題は、私のテストでは、以下の2行です

Expected spy flush to have been called. 

:すべての

spyOn($timeout, "flush") 
expect($timeout.flush).toHaveBeenCalled() 

まず、私は私を信じていません$timeoutの正しいメソッドを呼び出しています。私のコントローラでは、非常に明確で、$timeoutと呼ばれ、$timeout.flushではありません。第二に、Jasmine Spysの場合は、$timeoutは、クラスへの参照とメソッドの両方を必要とするため、spyOnにすることはできません。

私はどのように移動するかについてはあまりよく分かりません。私はどんな助けもありがとう - ありがとう!

+0

'flush'は' ngMock'にのみ存在し、テストから呼び出されるメソッドです。だから、フラッシュでスパイすることは、あなたがテストからそれを呼んだことを確認するだけです。それはあなたのテストです、あなたが行った/しなかったことを知っています、なぜあなたはそれをチェックしたいですか? –

答えて

1

ユニットテストを書くときは、$timeout.flush()に電話してから$timeout.verifyNoPendingTasks();に電話する必要があります。

verifyNoPendingTasks()は、保留中のタイムアウトがある場合に例外をスローします。したがって、基本的に例外は投げられることはありません。expect(function() {$timeout.verifyNoPendingTasks()}).not.toThrow()。お使いのコントローラに$timeoutは、あなたのユニットテストすることができますflushとして$timeout.flush(1000)で、その後、$timeout(function() {}, 1000)のような一定の時間を持っている場合も、あなたはexpect(function() {$timeout.flush()}).toThrow()

として期待を書くことができます。

hereで詳細を読むことができます。

また、実際の例については、CodePenをご覧ください。

+0

おかげでGaurav!私は何かをスパイする必要はありますか?あるいは、 '$ timeout.flush()'を呼び出して、期待値をチェックしますか? – theGreenCabbage

+0

'$ timeout.flush()'を呼び出すと、テスト中のすべての '$ timeout()'がクリアされます。 'expect(function(){$ timeout。verifyNoPendingTasks()})。not.toThrow() '。 – Gaurav

+0

そして、いいえ、 '$ timeout'がユニットテストで' ngMock'によって提供された模擬サービスオブジェクトであるため、何かを偵察する必要はありません。 – Gaurav

0

$ timeoutをスパイする場合は、スパイを使用してmodule.decoratorを呼び出して、実際にはreplace itにする必要があります。しかし、あなたは、あなたの指示の内部をその程度まで細かく管理することが本当に意味があるのか​​どうか、自分に尋ねたいと思うかもしれません。

関連する問題