$ observe函数永远不会在我的测试中被调用

时间:2012-12-03 19:58:03

标签: javascript unit-testing angularjs

我们有一个指令,它有一个可选属性。如果该属性不存在,则提供默认值。该属性通常根据作用域中的数据设置(即,属性的值通常是表达式而不是文字字符串。请参阅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'.

我在$observe函数中放置了一个console.log来试图查看发生了什么,当测试运行时,我从未看到日志。我必须为$observe运行一个明确的调用吗?还有其他事情在这里发生吗?

1 个答案:

答案 0 :(得分: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");
}));