我们有一个指令,它有一个可选属性。如果该属性不存在,则提供默认值。该属性通常根据作用域中的数据设置(即,属性的值通常是表达式而不是文字字符串。请参阅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
运行一个明确的调用吗?还有其他事情在这里发生吗?
答案 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");
}));