用不同的依赖项值测试AngularJS

Testing AngularJS with different dependency values

本文关键字:测试 AngularJS 依赖      更新时间:2023-09-26

假设我有一个在运行时配置并在其内部设置某些值的提供程序。提供者有一个暴露的get方法,所以这些值可以在angular控制器中访问。

在测试控制器时,是否有办法有效地测试不同情况下的提供商的值?

让它正确测试的唯一方法是在每个测试用例中重新定义appController,因为在提供程序中重新定义get方法以返回我想要的东西似乎不工作(这告诉我,当一个控制器被构造时,它通过值而不是通过引用来获取依赖项)。

describe("myController", function(){
    "use strict";
    describe("AppController", function(){
        var appController;
        var $rootScope;
        var $scope;
        var providerMock;

        beforeEach(function(){
            module('myController');
            inject(function(_$controller_, _$rootScope_){
                $controller = _$controller_;
                $rootScope = _$rootScope_;
                $scope = _$rootScope_.$new();
            });
        });
        describe('provider value is a', function(){
            beforeEach(function(){
                providerMock = { get: function(){ return 'a';}};
                appController = $controller('appController', {
                    $scope: $scope,
                    provider: providerMock
                });
            });
            it('isA should be true', function(){
                expect($scope.isA).toEqual(true);
            )};
        });
        describe('provider value is b', function(){
            beforeEach(function(){
                providerMock = { get: function(){ return 'b';}};
                appController = $controller('appController', {
                    $scope: $scope,
                    provider: providerMock
                });
            });
            it('isA should be false', function(){
                expect($scope.isA).toEqual(false);
            )};
        });
    });
});
如您所见,在两个描述中重新定义appController似乎是重复的。还有别的办法吗?

同样,假设我有另一个与提供者完全无关的测试用例,例如,如果我正在测试一个函数。我应该把它放在哪个appController实例化分支下?这有关系吗?

$controller本地依赖有它们的用例,但这是模块mock的作用。

var providerMockedValue;
...
module('myController', { provider: { get: function(){ return providerMockedValue;}} } );
...
providerMockedValue = 'a';
appController = $controller('appController', { $scope: $scope });