我正在为AngularJS 1.6.x项目“恢复”一些指令测试。它们最初是几年前添加的,很少被触摸,最终被删除,但是现在我将它们放回去并清理它们。
我注意到某些测试在scope
函数之间共享一个it
。这曾经起作用,但现在不再起作用。尽管我不再想要共享范围,但在继续之前,我必须更好地理解问题。
在下面的测试中,我将一个scope.test
值绑定到一个字母。这可行。我在下一个测试中更新了属性和$digest
,但失败了:
AssertionError: expected 'a' to equal 'b'
但是令我困惑的是,当使用相同的it
测试执行时,精确相同的测试可以正常/通过。
为什么?
scope
对象scope.test
的值实际上是b
it
方法应按顺序执行完整的自包含测试示例:
describe('test', () => {
let scope;
let $compile;
let $rootScope;
let $template;
// Compile helper
const compileTemplate = (scope, template) => {
const $elem = $compile(angular.element(template))(scope);
scope.$digest();
return $elem;
}
beforeEach(() => {
inject((_$compile_, _$rootScope_) => {
$compile = _$compile_;
$rootScope = _$rootScope_
});
});
it('test 1', () => {
scope = $rootScope.$new();
scope.test = 'a';
$template = compileTemplate(scope, '<div>{{ test }}</div>');
expect($template.text()).to.equal('a'); // passes
});
it('test 2', () => {
scope.test = 'b';
scope.$digest();
expect($template.text()).to.equal('b'); // fails
// AssertionError: expected 'a' to equal 'b'
});
// this does test 1 and 2 all together
it('test 3', () => {
scope = $rootScope.$new();
scope.test = 'a';
$template = compileTemplate(scope, '<div>{{ test }}</div>');
expect($template.text()).to.equal('a'); // passes
scope.test = 'b';
scope.$digest();
expect($template.text()).to.equal('b'); // passes
});
});