【问题标题】:Mocking ngResource in Angular unit tests在 Angular 单元测试中模拟 ngResource
【发布时间】:2016-10-05 14:48:34
【问题描述】:

我有一个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 有问题,但我不确定是什么问题。

【问题讨论】:

  • context 只是 NgResourceMock 的一个实例,所以 context.prototype 是 undefined ,你应该使用 NgResourceMock.prototype 代替。它只是解决了这个错误。模拟你可以使用this tutorial

标签: javascript angularjs jasmine karma-jasmine


【解决方案1】:

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

根据他们的文档:

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

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

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

希望这会有所帮助。

【讨论】:

    【解决方案2】:

    这是您问题的解决方案。

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

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

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

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

    加载你的应用模块

    这里可能和你的问题有相同的概念 another link here.

    希望对你有所帮助。

    【讨论】:

      猜你喜欢
      • 2020-11-19
      • 1970-01-01
      • 2023-04-07
      • 1970-01-01
      • 2015-08-24
      • 1970-01-01
      • 2018-11-24
      • 1970-01-01
      • 2021-09-18
      相关资源
      最近更新 更多