javascript - 单元测试 Angular/ ionic 项目

标签 javascript angularjs unit-testing ionic-framework

我有一个非常简单的 Controller ,看起来像这样。

timeInOut.controller('timeInOutController', function($scope, $filter, $ionicScrollDelegate){

    ... 

});

每当我尝试为它创建一个单元测试时......

(function() {
'use strict';

    var scope, controller, filter;

    describe('timeInOutController', function () {

        beforeEach(module('common.directives.kmDateToday'));

        beforeEach(inject(function ($rootScope, $controller, $filter) {
            scope = $rootScope.$new();
            filter = $filter;
            controller = $controller('timeInOutController', {
                $scope: scope
            });
        }));

        describe('#date setting', function(){

            ...

        });
    });
})();

我得到错误:

[$injector:unpr] Unknown provider: $ionicScrollDelegateProvider <- $ionicScrollDelegate

显然,在我的示例中,我并没有尝试将 $ionicScrollDelegate 注入(inject)到测试中,那只是因为我已经尝试了多种方法但没有成功,并且不知道是哪种方法尝试包含失败。

同样在我的 karma.conf.js 文件中,我包含了 ionic.bundle.jsangular-mocks.js 库/文件。

我可以成功地对其中不使用任何 $ionic 的任何内容进行单元测试,因此我知道我的测试框架设置正确,问题在于注入(inject)任何与 ionic 相关的内容。

最佳答案

如果您要通过 Angular 实例化您的 Controller ,则需要传入所有参数。通过添加参数,您可以告诉 Angular,每当您创建这些 Controller 之一时,我也需要这些东西,因为我依赖它们。

所以我的建议是模拟这些依赖关系的一些表示,并在创建 Controller 时将它们注入(inject)。它们不一定是(也不应该是)单元测试的实际服务。 Jasmine 使您能够创建可以注入(inject)的 spy 对象,这样您就可以验证该单元的行为。

(function() {
'use strict';

    var scope, controller, filter, ionicScrollDelegate;

    describe('timeInOutController', function () {

        beforeEach(module('common.directives.kmDateToday'));

        beforeEach(inject(function ($rootScope, $controller, $filter) {
            scope = $rootScope.$new();
            filter = $filter;

            // func1 and func2 are functions that will be created as spies on ionicScrollDelegate
            ionicScrollDelegate = jasmine.createSpyObj('ionicScrollDelegate', ['func1', 'func2']
            controller = $controller('timeInOutController', {
                $scope: scope,
                $filter: filter,
                $ionicScrollDelegate: ionicScrollDelegate
            });
        }));

        describe('#date setting', function(){

            ...

        });
    });
})();

您可以通过 jasmine's documentation 找到更多关于 spy 的信息

关于javascript - 单元测试 Angular/ ionic 项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26612156/

相关文章:

javascript - 表达 + AngularJS : app hangs on invalid url

.net - 如何模拟类的内部方法?

javascript - emberjs 一次获取所有表单字段/值

angularjs - 如何创建 AngularJs svg 指令

javascript - 如何正确转义 querySelector() 字符

javascript - 需要在不影响父元素的情况下点击每个 li 元素

c# - 如何模拟自定义 UserStore 和 RoleStore

python - python 单元测试中的 Neo4j 临时数据库

javascript - 当使用 jquery 或 javascript 选中 2 个复选框时,如何过滤 div 列表?

javascript - 我应该在 JavaScript 的短 block /函数中定义变量吗?