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

时间:2014-09-26 15:56:43

标签: angularjs unit-testing jasmine karma-runner

我已经设置了一个测试套件,用于在我的应用中测试控制器的行为。控制器有一个函数,它将属性放在$ 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块,我希望为他们重新设置环境:< / p>

    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作为参数传递给它。)运行此测试后,$rootScope.variable保持定义,在以下测试中,以及后续测试运行中的所有测试,只要业力服务器没有重新启动。

我已经尝试改变我实例化控制器的方式,传递它$ rootScope就像我传递其他范围一样(无论是否通过在下划线中包装$ rootScope确保没有名称解析冲突),尝试传递$ rootScope作为注入调用的参数而不是,但我无法摆脱这种行为。

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

1 个答案:

答案 0 :(得分:1)

我需要完全看到你的测试文件,因为我根本无法回答你的问题。一方面,你不应该以这种方式加载模块,在开头加载所有模块,否则你将获得injector already created,这意味着你不能使用inject()之后module() }}

另一方面,$rootScope永远不会在测试之间传递值,你做错了但是使用实际的代码,我看不到它。

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