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

Angularjs 为什么在测试控制器时,这些方法之间存在差异,angularjs,testing,jasmine,Angularjs,Testing,Jasmine,在对角度控制器进行Jasmine测试时,我发现这两种方法之间存在差异。不应该有,但是有。也就是说,使用debug,我发现在这两种情况下正确的模拟项都会通过,但是测试的行为不同 首先:这里我们模拟服务项,然后在创建时使用DI将其注入控制器 $provide.value('core.data.CompanyService', companyService); $provide.value('core.list.ListGenerator', listGeneratorFactory); $provi

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

首先:这里我们模拟服务项,然后在创建时使用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
});

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

鉴于在此之前模拟的正确设置,以下内容是等效的

  • $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
            });
        });
    });
    
  • 控制器局部变量

    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
        });            
    }));
    

  • 定义它们的行为方式重复,但没有答案:1)2)@Phil我一直在重组应用程序,使用第一种方法使测试失败,但第二种方法使测试通过。然而,理论上两者都在做同样的事情。你需要提供更多的信息,比如“第一种方法的测试是如何失败的”。您还应该提供实际的代码,因为上面的第一个代码部分是不可能的
    $provide
    仅在模块配置期间可用,而
    $controller
    仅在
    注入
    回调期间可用