单元测试时如何在 Angular 1.5 中向 $componentController 添加依赖项

Posted

技术标签:

【中文标题】单元测试时如何在 Angular 1.5 中向 $componentController 添加依赖项【英文标题】:how to add dependencies to $componentController in angular 1.5 while unit testing 【发布时间】:2017-02-15 04:44:10 【问题描述】:

我想在组件中添加依赖到我的控制器:

这是我的组件:

angular
  .module('app')
  .component('myComponent', 
    template: '<div>some content</div>',
    controller: ["$routeParams", function ($routeParams) 
       var ctrl = this;
       ctrl.myId = $routeParams.id;
  );

现在我只想测试如下:

describe("spec for myComponent", function () 

  var $componentController;
  var $routeParams;

  beforeEach(module('app'));
  beforeEach(inject(function (_$componentController_, _$routeParams_) 
    $componentController = _$componentController_;
    $routeParams = _$routeParams_;
    $routeParams = 
      myId: 42
    
  ));

  it('should init', function () 

    var ctrl = $componentController('myComponent', $routeParams, null);

    expect(ctrl.myId).toBe(42);

  );
);

但不幸的是,ctrl.myId 未定义,因为 $routeParams 未正确注入。为什么?

【问题讨论】:

var ctrl = $componentController('myComponent', $routeParams, null); 更改为 var ctrl = $componentController('myComponent', $routeParams, null); 另请注意,您可以使用第二个参数来注入模拟 $routeParams (请参阅 Neo182 的答案)。 【参考方案1】:

我的情况和你的很相似,google了一段时间,但几乎一无所获,但最后我自己解决了问题:这是你的情况的解决方案:

describe("spec for myComponent", function () 

  var $componentController;
  var mockRouteParams = id : 1;

  beforeEach(module('app'));

  beforeEach(inject(function (_$componentController_) 
    $componentController = _$componentController_;
  ));

  it('should init', function () 

    var ctrl = $componentController('myComponent', $routeParams:mockRouteParams, null);

    expect(ctrl.myId).toBe(1);

  );
);

还要检查 Mocking $routeParams in a test in order to change its attributes dynamically 关于 $routeParams 的模拟。

【讨论】:

【参考方案2】:

你似乎在这里重新定义了$routeParams

$routeParams = _$routeParams_;
$routeParams = 
  myId: 42

执行以下操作应该可以解决您的问题(另请注意,您希望 id$routeParams 的属性,而不是 myId):

$routeParams = _$routeParams_;
$routeParams.id = 42;

【讨论】:

以上是关于单元测试时如何在 Angular 1.5 中向 $componentController 添加依赖项的主要内容,如果未能解决你的问题,请参考以下文章

使用 Karma Jasmine 的 Angular 1.5 组件模板单元测试

Angular 1.5 单元测试控制器,需要父组件的控制器

Angular 2:如何在单元测试时模拟 ChangeDetectorRef

Angular:运行Git push时如何强制运行单元测试?

在 Angular 中使用 Jasmine 使用 *ngIf 指令时,如何对元素是不是可见进行单元测试

在AngularJS单元测试中模拟模块依赖性