【问题标题】:AngularJS controller unit tests - injecting servicesAngularJS 控制器单元测试 - 注入服务
【发布时间】:2012-05-20 02:05:36
【问题描述】:

一个关于 AngularJS 单元测试的简单问题。我有一个使用简单服务的控制器(改编自 angular-seed 项目)

services.js:

angular.module('myApp.services', []).value('version', '0.1');

controllers.js:

function MyCtrl1($s, version) {
  $s.version = version;
}
MyCtrl1.$inject = ["$scope","version"];

这在我的应用程序中效果很好。但是,我在单元测试框架工作中创建控制器时遇到了麻烦。我不知道我们如何注入“版本”服务(或创建实例)并将其传递给 $controller() 工厂 - 我假设这就是我想要做的?!这是最基本的规范:

controllerSpec.js:

beforeEach(inject(function($rootScope, $controller) {
  scope = $rootScope.$new();
  // how about version service?
  ctrl = $controller(MyCtrl1, {$scope: scope, /* version: <where from?> */});
}));

it('Version should be 0.1 ...', function() {
    expect(scope.version).toBe('0.1');
});

运行测试工具会产生: >test.sh

...失败(3.00 毫秒):错误:错误:未知提供程序:versionProvider

我用 $injector/$provider 和 module() 尝试了各种方法,但无济于事。我确定答案很简单,但我看不到。

【问题讨论】:

    标签: unit-testing angularjs


    【解决方案1】:

    只需将beforeEach(module('myApp.services')) 添加到您的描述块中。这会将带有“版本”服务的服务模块加载到测试注入器中,并使其可用于您的测试。

    【讨论】:

    • 谢谢!那很简单。我没有想到有两个 beforeEach() 调用 - 很有趣。
    • 顺便说一句,为具有服务依赖性的控制器编写单元测试是一种好习惯吗?还是为服务创建一个mock,然后为控制器编写一个测试,为服务编写一个测试更好?
    • @e.gluhotorenko 我发现第二个选项更容易,使用模拟服务测试控制器。然后分别测试服务。我发现关于 how to use mocks in Jasmine 的 Tim Buschtöns 文章真的很有帮助。使为服务设置模拟变得容易,并且总体上我的测试更加灵活。
    猜你喜欢
    • 2014-09-28
    • 1970-01-01
    • 2015-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-23
    • 1970-01-01
    相关资源
    最近更新 更多