为什么这些方法在测试控制器时存在差异

时间:2015-10-06 10:35:56

标签: angularjs testing jasmine

在为角度控制器进行Jasmine测试时,我发现这两种方法之间存在差异。应该没有,但有。也就是说,使用调试,我发现在两种情况下都会通过正确的模拟项目,但测试的行为会有所不同。

首先:在这里我们模拟服务项目,然后在创建时使用DI将其注入控制器。

$provide.value('core.data.CompanyService', companyService);
$provide.value('core.list.ListGenerator', listGeneratorFactory);
$provide.value('core.actions.ActionContext', actionContext);

ActivitiesCtrl = $controller('activities.ActivitiesCtrl', {
  $scope: scope
});

第二: 这里我们在控制器创建中明确指定注入的服务项:

ActivitiesCtrl = $controller('activities.ActivitiesCtrl', {
  $scope: scope,
  'core.lists.ListGenerator': listGeneratorFactory,
  'core.actions.ActionContext': actionContext,
  'core.data.CompanyService': companyService
});

1 个答案:

答案 0 :(得分:0)

如果您的第一段代码实际上是您所拥有的,那么我认为我看到了问题;应在模块 config 部分中设置提供程序,并且应在$controller回调中访问inject

如果在此之前正确设置了模拟,则以下是等效的

  1. $injector

    上的提供商
    beforeEach(function() {
        module('your.controller.module', function($provide) {
            $provide.value('core.list.ListGenerator', listGeneratorFactory);
            $provide.value('core.actions.ActionContext', actionContext);
            $provide.value('core.data.CompanyService', companyService);
        });
    
        inject(function($controller) {
            // assuming scope is defined somewhere
            ActivitiesCtrl = $controller('activities.ActivitiesCtrl', {
                $scope: scope
            });
        });
    });
    
  2. 控制器本地人

    beforeEach(inject($controller) {
        // again, assuming scope is defined somewhere
    
        ActivitiesCtrl = $controller('activities.ActivitiesCtrl', {
            $scope: scope,
            'core.lists.ListGenerator': listGeneratorFactory,
            'core.actions.ActionContext': actionContext,
            'core.data.CompanyService': companyService
        });            
    }));