在为角度控制器进行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 :(得分:0)
如果您的第一段代码实际上是您所拥有的,那么我认为我看到了问题;应在模块 config 部分中设置提供程序,并且应在$controller
回调中访问inject
。
如果在此之前正确设置了模拟,则以下是等效的
$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
});
}));