6

Jasmine を使用してコントローラーの単体テストを作成していますが、この状況を処理する方法についてコミュニティからフィードバックを得たいと考えていました...

私はコントローラーを持っています-InvoiceController、次のように:

angular.module('myModule').controller('myController', ['$scope',
    function($scope) {
        $scope.doSomething = function() {
            $scope.something = 'bar';
        };
    }
]});

単体テストでは、コントローラーに期待されるメソッドがあることを確認します。

it('should be able to do some work', function() {

    // initialize scope properties
    scope.someProperty = 'foo';

    // load controller using those properties
    injectController();

    // do I have all of the functions necessary to do this work?
    expect(typeof (scope.doSomething)).toBe('function');

    // now execute test
    scope.doSomething();
    expect(scope.something).toBe('bar');       

}

そして最後に、私の html には、次のように ng-click を持つ要素があります。

<button ng-click="doSomehing()">Do Something</button>

良さそうですよね?しかし、誰かが私が間違ったことをキャッチしましたか?

私の ng-click メソッドのつづりが間違っていますが、すべてのテストは緑色で、人生はバラ色のように見えます...その男をクリックしようとしても何も起こらないまで. レンダリング時のエラーも、クリック時のエラーもありません。うーん。

私がコードをリファクタリングしていると、これが私を手に入れました。単体テストとコントローラーで doSomething の名前を doSomethingCooler に変更しましたが、html に場所がありません。頭をかきむしった後、何が見落とされたかがわかります。

マークアップが有効であることを確認する方法が欲しいです。E2E テストは明らかな解決策のようですが、脆弱性が生じやすいため、いくつかの代替手段があることを期待しています。

これが ASP.Net の場合、コード ビハインドからクリック イベントを添付して、コンパイル時エラーと実行時エラーが発生するようにします。

想い??

サッド

4

1 に答える 1

2

できることの 1 つは、テンプレート テキストを取得して実行$compileすることです。そして、それをコントローラーのスコープにリンクします。次にdom.find('[ng-click]').click();、コントローラーのスコープでそれらのいずれかが定義されていない場合にスローする必要がある、のようなことを行うことができます。これは、一般的にディレクティブをテストする方法に似ています。

于 2013-10-29T08:54:21.353 に答える