我已经设置了一个测试套件,用于在我的应用中测试控制器的行为。控制器有一个函数,它将属性放在$ 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的正确方法是什么,并确保所有测试都可以从相同的干净状态开始?
答案 0 :(得分:1)
我需要完全看到你的测试文件,因为我根本无法回答你的问题。一方面,你不应该以这种方式加载模块,在开头加载所有模块,否则你将获得injector already created
,这意味着你不能使用inject()
之后module()
}}
另一方面,$rootScope
永远不会在测试之间传递值,你做错了但是使用实际的代码,我看不到它。