为什么$rootScope状态在我的测试之间持续存在



我已经建立了一个测试套件,用于测试应用程序中控制器的行为。控制器有一个函数,它将属性放在$rootScope上。我的问题是,这些属性在测试运行后仍然存在,并且它们的存在会在其他测试用例中导致不必要的行为。尽管我尝试用详细的beforeEach块为每个测试重新创建相同的设置,但这种情况还是会发生——事实上,"损坏"的状态甚至会在未来在同一Karma服务器上运行的所有测试中持续存在!(停止并重新启动服务器当然会清除它)

以下是我的一些代码,用于将事情放到上下文中。首先,我做了一个简单的测试,看看函数(稍后将修改rootScope)是否已经定义:

describe('testing my controller', function () {
var scope;
beforeEach(function(){
    angular.mock.module('mainApp');
});
beforeEach(inject(function ($controller, $rootScope) {
    //if I observe the contents of the $rootScope here, the effects of previous runs
    //    of tests cases after this one can be seen on it!
    scope = {};
    $controller('myCtrl', {$scope: scope});
}));
it('should define the function', function () {
    expect(typeof scope.myFunc).toBe('function');
});

稍后,在同一个文件中,但有一个不同的describe块,我有更多的测试,它们有自己单独的beforeEach块,我希望为它们重新设置环境:

    beforeEach(function(){
    angular.mock.module('mainApp');
    //(...)
    //here I create an other module for some mocked services
    angular.mock.module('myMockModule');

然后我执行与上面相同的注入块来实例化控制器。在后一个块的测试用例中,我调用控制器上的myFunc函数,该函数在rootScope上设置变量,如下所示:

$rootScope.variable = "asdfg";

(在控制器的定义中,$rootScope作为参数传递给它。)运行此测试后,只要不重新启动karma服务器,$rootScope.variable在以下测试和随后测试中的所有测试中都会保持定义状态。

我尝试过改变实例化控制器的方式,像传递另一个作用域一样传递$rootScope(通过用下划线包裹$rootScope来确保没有名称解析冲突),也尝试过在注入调用中传递$rootScope作为参数,但我无法摆脱这种行为。

这里发生了什么?为什么rootScope对象持续存在?在单元测试中创建模拟rootScope,并确保所有测试都能从相同的干净状态开始的正确方法是什么?

我需要完整地查看您的测试文件,因为我根本无法理解您的问题。一方面,你不应该以这种方式加载模块,一开始就全部加载,否则你会得到injector already created,这意味着你不能使用inject()和之后的module()

另一方面,$rootScope永远不会在测试之间携带值,你做错了什么,但对于实际的代码,我看不出来

查看此演示:http://plnkr.co/edit/siHHqg4HLkwpZUyby83r?p=preview

最新更新