【问题标题】:Why is there a difference between these approaches in testing a controller为什么这些方法在测试控制器时存在差异
【发布时间】:2015-10-06 10:35:55
【问题描述】:

在为 Angular 控制器进行 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
});

【问题讨论】:

  • 定义它们的行为方式不同
  • @Phil 我一直在重构应用程序,使用第一种方法使测试失败,但第二种方法使测试通过。然而,两者在理论上都在做同样的事情。
  • 您需要提供更多信息,例如“第一种方法的测试是如何失败的”。您还应该提供实际代码,因为上面的第一个代码部分是不可能的; $provide 仅在模块 config 期间可用,而 $controller 仅在 inject 回调中可用

标签: angularjs testing jasmine


【解决方案1】:

如果您的第一个 sn-p 代码实际上是您所拥有的,那么我想我看到了问题;提供者应在模块 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
        });            
    }));
    

【讨论】:

    猜你喜欢
    • 2020-08-02
    • 1970-01-01
    • 1970-01-01
    • 2019-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-20
    相关资源
    最近更新 更多