2017-05-22 42 views
0

我试图嘲弄由require('falcor');回到我有两个途径,一个呼叫使用var dataModel = new falcor({source: this});如何在Falcor数据模型构造间谍茉莉花1

代码另一条路线的构造看起来像这样

var falcor = require('falcor'); 
module.exports = { 
    route: 'items', 
    get: function (pathSet) { 
     var dataModel = new falcor({source: this}); 
     var ids = '1'; 
     dataModel.get('itemIds', ids).then(function (response) { 
      // Code I can't get to in Jasmine 1.x tests 
     }); 
    } 
} 

我想要构造函数返回一个间谍,所以我可以调用Promise.resolve并发回模拟数据用于测试目的。我不知道如何做到这一点,而不需要将呼叫转移到另一个模块,我可以单独模拟。我认为这里可能对我有些帮助的一些问题是:

  1. 我在哪里可以找到由falcor等模块定义的构造函数?我试图寻找'全球'的对象,但没有运气。如果我找到了这个构造函数,我可以用spyOn(global, 'falcor').andReturn(/* object with a mocked get method*/);替换它吗?
  2. 有没有更好的方法使测试更容易从另一条路线内部调用路线?

感谢您的帮助。

回答

0

要启动问题2:是的,要从另一条路线获取数据,请将ref返回到该路线。不要在w/i路由中实例化另一个模型。例如。

const itemsRoute = { 
    route: 'items[{keys:indices}]', 
    get(pathSet) { 
    // map indices to item ids, likely via DB call 
    // in this case, SomeDataModel handles network requests to your data store and returns a promise 
    return SomeDataModel.getItemsByIndices(pathSet.indices) 
     .then(ids => ids.map((id, idx) => ({ 
     path: ['items', pathSet.indices[idx]], 
     value: { 
      $type: 'ref', 
      value: ['itemById', id] 
     } 
     }))); 
    } 
}; 

const itemByIdRoute = { 
    route: 'itemById[{keys:ids}].name', 
    get(pathSet) { 
    return new Promise((resolve) => { 
     resolve(pathSet.idx.map(id => ({ 
     path: ['itemById', id, 'name'], 
     value: { 
      $type: 'atom', 
      value: `I am item w/ id ${id}` 
     } 
     }))); 
    }); 
    } 
}; 

当收到请求时在用于(例如)[items, 2, name],它将击中第一items路线,解决[items, 2][itemById, someId],并解决在itemsById路线剩余name键。

至于问题1:而不是嘲讽falcor,只是嘲笑你用来远程调用你的数据源的任何东西。在上述情况下,只需模拟SomeDataModel