使用Mocha和Angular模拟HTTP请求的Global BeforeEach

时间:2015-10-09 16:47:23

标签: javascript angularjs unit-testing mocha

我在module.run

中触发的请求很少
angular.module('demo').run(function($http) {
  $http.get('/some/thing');
  $http.get('/some/other/thing');
});

当我在测试中使用$rootScope.$apply来解决模拟承诺时,unexpected request errors'/some/thing'获得'/some/other/thing'

解决此问题的一种方法是在之前设置$httpBackend

$httpBackend.when('GET', mockData.API_URL + '/some/thing').respond(200, {});
$httpBackend.when('GET', mockData.API_URL + '/some/other/thing').respond(200, {});

这会有效,但这意味着我必须将它放在我使用$rootScope.$apply的每个测试文件的前面。

如何为每个测试文件制作全局$httpBackend个配置? 或者是否有更好的解决方案来解决这个问题?

2 个答案:

答案 0 :(得分:2)

来自Mocha website," Root-Level Hooks":

  

您也可以选择任何文件并添加" root" -level钩子。例如,   在所有describe()块之外添加beforeEach()。这将导致   回调到beforeEach()在任何测试用例之前运行,无论如何   它所居住的文件(这是因为Mocha有一个隐藏的describe()   块,称为"根套件")。

beforeEach(function() {   
    console.log('before every test in every file'); 
});

答案 1 :(得分:1)

如果您真的需要所有测试,VinceOPS答案是最好的。如果你不想在每个测试中需要它,我会做什么,但只是很多将$ httpBackend调用移动到一个单独的函数中并将其放在一个共享的js文件中。然后你需要在beforeEach之前调用该函数。

对于更复杂的配置,我经常为describe()it()或您定义测试的函数创建自己的包装函数,以防止写入(过多)重复代码。