当在不同的测试块中发生范围更改/消化时,测试失败

时间:2019-02-02 01:56:04

标签: javascript angularjs mocha

我正在为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
    });
});

0 个答案:

没有答案