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 回答