模拟提供者

时间:2015-06-11 01:28:56

标签: angularjs sinon angular-mock

我有一个模块,在其配置中使用我需要模拟的提供程序。

提供者本身有register函数,它接受2个参数和$get函数返回一个对象,但这并不重要(我认为)因为我嘲笑它无论如何。以防here's the entire provider

模块使用这样的提供程序:

angular.module('replenishment').config(configureReplenishmentColumnDef);

configureReplenishmentColumnDef.$inject = ['columnDefProvider'];
function configureReplenishmentColumnDef(columnDefProvider) {
   let config = {
      matchWhen: ((schema)=> _.get(schema, 'format') === 'replenishment'),
      $get: replenishmentColDef
   };

   columnDefProvider.register(config);
}

replenishmentColDef.$inject = ['$q', 'schema', 'medData'];
function replenishmentColDef($q, schema, medData) { 
  ....
}

我开始整理像这样的规范(我们用CoffeeScript编写的测试)

describe 'replenishment-module', ->

  columnDefProvider = undefined

  beforeEach ->
    module ($provide)->
      $provide.provider 'columnDef', ->
         @.register = sinon.spy()
         @.$get = sinon.spy()
         return // had to put an explicit return here, as @DTing suggested    

    module 'replenishment'

    inject ->

现在我不知道如何正确模拟提供商的方法。你们可以告诉我,也许我需要使用存根而不是间谍。

1 个答案:

答案 0 :(得分:1)

尝试添加这样的explict返回,我认为你得到了一个格式错误的函数:

describe 'replenishment-module', ->

  columnDefProvider = undefined

  beforeEach ->
    module ($provide)->
      $provide.provider 'columnDef', ->
        @.register = sinon.spy()
        @.$get = sinon.spy()
        return        

    module 'replenishment'

    inject ->

我认为这就是你的javascript等价物:

beforeEach(function() {
  module(function($provide) {
    return $provide.provider('columnDef', function() {
      this.register = sinon.spy();
      return this.$get = sinon.spy();
    });
  });

这会使你的提供者columnDef没有$ get工厂方法:

function Something() {
  return this.get = function() {
    console.log("get");
  };
}

var something = new Something();
something.get();