2

オプションの属性を持つディレクティブがあります。属性が存在しない場合は、デフォルト値が提供されます。属性は通常、スコープ内のデータから設定されます (つまり、属性の値は通常、リテラル文字列ではなく式です。http://jsfiddle.net/8PGZ4/を参照してください)。

そのattrs.$observeため、スコープを適切に設定するためにディレクティブで使用しています。これは、アプリ自体でうまく機能します。ただし、これを (Jasmine を使用して) テストしようとすると、 の関数$observeが実行されません。テストは次のようになります。

describe("myDirective", function(){ 
    function getDirectiveScope(compile, rootScope, directiveHTML)
    {
        return (compile(directiveHTML)(rootScope)).scope();
    }

    describe("foo", function () {
        it("should return the default value", inject(function ($compile, $rootScope) {
            var directiveScope = getDirectiveScope($compile, $rootScope, '<div my-directive></div>');
            expect(directiveScope.bar).toBe("No Value");
        }));
        it("should now return the value given", inject(function ($compile, $rootScope) {
            $rootScope.foo = "asdf";
            var directiveScope = getDirectiveScope($compile, $rootScope, '<div my-directive foo="{{foo}}"></div>');
            expect(directiveScope.bar).toBe("asdf");
        }));
    });
});

これらは、次のエラーで失敗します。

Expected undefined to be 'No Value'.
Expected undefined to be 'asdf'.

関数にconsole.log を入れて、$observe何が起こっているのかを確認しようとしましたが、テストを実行してもログは表示されません。を実行するために必要な明示的な呼び出しはあり$observeますか? ここで何か他のことが起こっていますか?

4

1 に答える 1

2

テストで AngularJS マジックを実行するには、ダイジェスト サイクルをトリガーする必要があります。試す:

it("should return the default value", inject(function ($compile, $rootScope) {
  var directiveScope = getDirectiveScope($compile, $rootScope, '<div my-directive></div>');
  $rootScope.$digest();
  expect(directiveScope.bar).toBe("No Value");
}));
于 2012-12-03T20:27:47.413 に答える