在Angular单元测试中模拟ngResource [英] Mocking ngResource in Angular unit tests

查看:161
本文介绍了在Angular单元测试中模拟ngResource的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有 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}, {});
  });
});

但我一直看到以下错误:

but I keep seeing the following error:

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

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

This leads me to believe that something is wrong with my ngResourceMockFactory, but I'm not sure what it is.

推荐答案

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

Don't know if this can be of any help, but if you are trying to evaluate asynchronous operations in your tests, you may want to use the done() method in Jasmine.

根据他们的文件:

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

传递已完成作为参数 beforeEach 回调,在每个之前的任何测试运行都会等到 done()函数被调用。

by passing done as a parameter of the beforeEach callback, any test run after the before each will wait until the done() function has been called.

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

Source: Jasmine (Asynchronous Support section).

希望这会有所帮助。

这篇关于在Angular单元测试中模拟ngResource的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆