繁体   English   中英

在Angular单元测试中模拟ngResource

[英]Mocking ngResource in Angular unit tests

我有一个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像这样:

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回调的参数,在每个之前的任何测试运行将等到调用done()函数。

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

希望这可以帮助。

这是您的问题的解决方案。

错误TypeError: 'undefined' is not an object (evaluating 'context.prototype.$promise')是在尝试调用promise对象之前调用定义它的函数或定义了父函数时引起的。

这里的returnValue(ngResourceMock)直接调用函数而不需要定义上下文和参数。

因此,您可以尝试添加另一个beforeEach语句

beforeEach(angular.mock.module(app));

加载您的应用模块

这里可能是与您的问题相关的另一个链接。

希望它可能对你有所帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM