javascript - 在 Angular 单元测试中模拟 ngResource

标签 javascript angularjs jasmine karma-jasmine

我有一个看起来像这样的 ngResourceMockFactory:

(function() {
  'use strict';

  angular.module('app')
    .factory('NgResourceMock', ngResourceMockFactory)
  ;

  ngResourceMockFactory.$inject = [];

  function ngResourceMockFactory() {
    function NgResourceMock() {
      var context = this;

      context.$promise.then = function() {
        context.prototype.$promise.then.apply(context, arguments);
      };

      context.$promise.finally = function() {
        context.prototype.$promise.finally.apply(context, arguments);
      };
    }

    NgResourceMock.prototype.$promise = {
      then: function(onSuccess, onError) {
        this.$promise.onSuccess = onSuccess;
        this.$promise.onError = onError;
      },
      finally: function(onComplete) {
        this.$promise.onComplete = onComplete;
      }
    };

    return NgResourceMock;
  }
})();

我在 beforeEach 中将其注入(inject)到我的测试中,如下所示:

beforeEach(inject(function(NgResourceMock) {
  ngResourceMock = new NgResourceMock();
}));

然后我这样使用它:

describe('initiateWorkflow function', function() {
  beforeEach(function() {
    vm.player = {id: 123};
    spyOn(dataService, 'initiateWorkflow').and.returnValue(ngResourceMock);
    vm.initiateWorkflow();
  });

  it('should call dataService.initiateWorkflow', function() {
    expect(dataService.initiateWorkflow).toHaveBeenCalledWith({playerId: vm.player.id}, {});
  });
});

但我一直看到以下错误:

TypeError: 'undefined' is not an object (evaluating 'context.prototype.$promise')

这让我相信我的 ngResourceMockFactory 有问题,但我不确定是什么。

最佳答案

不知道这是否有任何帮助,但如果您尝试评估测试中的异步操作,您可能需要使用 Jasmine 中的 done() 方法。

根据他们的文档:

beforeEach(function(done) {
    setTimeout(function() {
      value = 0;
      done();
    }, 1);
});

通过将 done 作为 beforeEach 回调的参数传递,在 before each 之后运行的任何测试都将等到 done() 函数已被调用。

来源:Jasmine (异步支持部分)。

希望这对您有所帮助。

关于javascript - 在 Angular 单元测试中模拟 ngResource,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39877212/

相关文章:

javascript - 将作用域传递给 AngularJS 上的 Service

javascript - 类型错误:数字不是函数

javascript - 在 div 后代中的任何位置查找类

AngularJS:货币格式。更改分数大小、千位分隔符和分数分隔符

java - org.springframework.web.bind.MissingServletRequestParameterException异常

javascript - Jasmine 模拟 Angular $http - 错误 : describe does not expect a done parameter

javascript - 单元测试 Angular Directive(指令)被文本区域取代

unit-testing - AngularJS - 测试指令链接功能,如何监视 Controller

javascript - 使用此压缩多次点击和提交功能

javascript - 将 TR 和 TD 标签写入 DIV/TD 的内部 HTML