gpt4 book ai didi

angularjs - 如何在 AngularJS 中测试 .run?

转载 作者:行者123 更新时间:2023-12-04 07:01:37 25 4
gpt4 key购买 nike

myApp.run([
'$rootScope', 'userService', function($rootScope, userService) {
return userService.isAuthenticated().then(function(response) {
if (response.data.authenticated) {
return $rootScope.$broadcast('login', response.data);
} else {
return userService.logout();
}
});
}
]);

这是我在 init.js 中的代码文件。我怎样才能对此进行单元测试?

最佳答案

单元测试 run(..) block 就像加载您的 module(..) 一样简单 Jasmine .

以下所有代码均可在 this plunker 中找到.

考虑以下非常简单的 app.js :

var _idx = 1;
window.log = function(s) {
console.log('(' + _idx++ + ') ' + s);
};

var app = angular.module('myapp', []);

app.run(function($rootScope) {
log('run block');
$rootScope.valueSetInRun = 666;

});

app.controller('MainCtrl', function($scope) {
log('MainCtrl block');
});

请注意,标记在此应用程序中无关紧要。

现在考虑以下测试:
describe('myapp', function() {

beforeEach(module('myapp'));

beforeEach(inject(function($rootScope) {
log('beforeEach');
}));

it('should allow me to test the run() block', inject(function ($rootScope) {
log('it block');
expect( $rootScope.valueSetInRun ).toBe(666);
}));
});

这是控制台输出:
(1) run block 
(2) MainCtrl block
(3) run block
(4) beforeEach
(5) it block

注意测试通过

一些重要的观察
  • 前两个控制台输出,(1)(2)在正常应用程序执行期间被记录
  • 记录消息 (3)(5)在测试运行时输出。


  • 综上所述,我们可以得出以下结论:
  • 在单元测试中,模块“myapp”被实例化
  • 在单元测试中,MainCtrl 没有被实例化
  • 在单元测试中,run block 已执行
  • 运行单元测试时,beforeEach...run先执行 block ,然后 beforeEach最后是 it堵塞。
  • 第二个beforeEach不是 用于单元测试 run block (请注意,您可以在 beforeEach 之前放置 beforeEach(module('myapp')); block ,但是如果您尝试在该 block 中创建注入(inject)器,您的测试将失败)

  • 最后,我们可以得出结论,上面的代码是测试 run 的方法。堵塞。 对于您的特定测试,有了这些知识,就可以使用 dependency injection mocking 构建单元测试。和 Jasmine's toHaveBeenCalled() assertion .

    关于angularjs - 如何在 AngularJS 中测试 .run?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23662829/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com