如何监视Jasmine 1中的Falcor数据模型构造函数

时间:2017-05-22 22:18:35

标签: falcor

我正在尝试模拟require('falcor');返回的构造函数我有两条路由,一条使用var dataModel = new falcor({source: this});调用另一条路径

代码看起来像是

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. 替换它
  3. 是否有更好的方法可以让测试更容易从另一条路线内部调用路线?
  4. 感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

开始问题2:是的,要从另一条路线获取数据,请返回参考路线。不要在路线上实例化另一个模型。 E.g。

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],并解析剩余的name密钥在itemsById路由中。

关于问题1:只需模拟用于远程调用数据源的任何内容,而不是模仿falcor。在上述情况下,只需模拟SomeDataModel