【问题标题】:Jasmine spyOn on function and returned objectJasmine spyOn 函数和返回对象
【发布时间】:2016-05-12 11:08:54
【问题描述】:

我正在使用带有 Angular 的 MeteorJS 并想测试控制器。我的控制器使用 $reactive(this).attach($scope)。我需要检查一下,是否调用了这个方法。

我为间谍创建了类似的东西:

var $reactive = function(ctrl) {
    return {
        attach:function(scope) {}
    }
};

所以我可以这样称呼它:

$reactive('aaa').attach('bbb');

如何在测试中做到这一点?

spyOn($reactive, 'attach');

不起作用。我得到错误:attach() 方法不存在

以及如何检查它是否被调用? 这是个好电话吗?

expect($reactive).toHaveBeenCalledWith(controller);

以及如何检查是否使用 args(范围)调用了函数 attach?

【问题讨论】:

  • 看起来$reactive 返回一个包含附加方法的对象,对吧?并且你想测试这个 attach 方法是否被调用。

标签: angularjs unit-testing meteor jasmine angular-mock


【解决方案1】:

您需要模拟$reactive 组件。将其替换为在测试范围内返回 spyObj 的间谍。然后触发使$reactive 方法运行和测试的原因。

var reactiveResult = jasmine.createSpyObj('reactiveResult', ['attach']);
var $reactive = jasmine.createSpy('$reactive').and.returnValue(reactiveResult);
var controller = {};
    beforeEach(function () {
      module(function ($provide) {
        $provide.factory('$reactive', $reactive);
      });
      module('yourAppModule');
    });

it('Should call attach', function () {
  $reactive(controller).attach();
  expect($reactive).toHaveBeenCalledWith(controller);
  expect(reactiveResult.attach).toHaveBeenCalled();
}) ;

您也可以将$reactive spy 提供给控制器依赖项:

var reactiveResult = jasmine.createSpyObj('reactiveResult', ['attach']);
var $reactive = jasmine.createSpy('$reactive').and.returnValue(reactiveResult);
var ctrl;
    beforeEach(inject(function ($controller) {
      ctrl = $controller('YourController', {$reactive: $reactive });
    }));

it('Should call attach', function () {
  //ctrl.triggerThe$reactiveCall
  expect($reactive).toHaveBeenCalledWith(ctrl);
  expect(reactiveResult.attach).toHaveBeenCalled();
}) ;

【讨论】:

  • 非常感谢!现在我对测试有了更多的了解。
猜你喜欢
  • 2015-08-22
  • 1970-01-01
  • 1970-01-01
  • 2014-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多