【发布时间】:2015-09-20 13:12:52
【问题描述】:
我有一组分布在 2 个模块中的测试。
第一个模块有测试,对于它的依赖,我声明了模拟来测试它,而不受它的依赖模块的任何影响,如下所示:
beforeEach(function(){
angular.mock.module(function ($provide) {
$provide.value("mockServiceFromModule1", mockServiceFromModule1);
$provide.value("mockServiceFromModule2", mockServiceFromModule2);
});
angular.module('module1', []);
angular.module('module2', []);
angular.mock.module('moduleThatIAmTesting');
angular.mock.inject(function (_$rootScope_, _$q_, _$httpBackend_, ..., somethingFromTestModule) {
});
})
第二个模块有一系列测试,当我只运行它们时,它们都通过了。
beforeEach(function(){
angular.mock.module('module1');
angular.mock.inject(function (_$rootScope_, _$q_, _$httpBackend_, ..., somethingFromModule1) {
});
})
使用 f(仅运行它们)运行时的两个测试都有效,但是当我运行整个测试套件时,我得到了错误,特别是关于模块声明或 $httpBackend。
如何让 jasmine 运行每个测试,就好像它们是唯一的测试一样?
似乎我在每次测试中都弄乱了 angular/modules/$httpBackEnd,并且在开始新测试时更改正在传播。
更新 1 我有一个jsFiddle 代表这个问题。 问题的结构是:
- 使用模拟依赖模块运行某些测试
- 稍后另一个测试想要测试实际的模拟模块
- 由于第一个模具已经加载,我们无法覆盖它,因此测试失败。
在 JSFiddle 上,关于 $httpBackend 没有任何内容可刷新的错误是因为对 expectedGet 的请求从未被命中,并且由于先前加载的空模块而从未被命中
重要的是要注意,测试的顺序是唯一与失败相关的事情,就像在这个 JSFiddle 中一样,它们通过了相同的测试。
我当然可以做一个测试命令并绕过它,但我的目标是找到一种方法来隔离测试,而不用担心其他测试的副作用。
【问题讨论】:
-
是的,问题不是模拟模块依赖关系,更多的是在之前和下一次测试中测试了完整模块,它仍然加载。所以我有一个依赖指令,我不关心给定的测试试图点击一些我不想服务的html模板等等
标签: javascript angularjs karma-jasmine