2015-10-06 48 views
0

在对Angular Controller进行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 
}); 
+0

定义如何他们的行为不同的 – Phil

+0

重复,但没有答案:1)[Angular.js测试控制器:指定依赖通过$提供vs $控制器](http://stackoverflow.com/questions/30776642/angular-js-testing-controllers-specifying-依赖关系 - 通过提供vs控制)2)[AngularJS茉莉服务模拟](http://stackoverflow.com/questions/30510463/angularjs-jasmine-service-mock) –

+0

@Phil我已经重组的应用程序,和使用第一种方法使测试失败,但第二种方法使测试通过。然而在理论上都是这样做的。 –

回答

0

如果你的代码的第一个片段其实是你有什么的话,我想我看到的问题;提供商应设置在模块配置部分和$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 
        });    
    }));