如何在 Jasmine 1 中监视 Falcor 数据模型构造函数
Posted
技术标签:
【中文标题】如何在 Jasmine 1 中监视 Falcor 数据模型构造函数【英文标题】:How to spy on a Falcor Data Model constructor in Jasmine 1 【发布时间】:2017-10-22 16:58:34 【问题描述】:我正在尝试模拟 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
并发送回模拟数据以进行测试。如果不将调用移动到另一个我可以单独模拟的模块中,我不确定如何做到这一点。我认为一些可能对我有帮助的问题是
-
在哪里可以找到 falcor 等模块定义的构造函数?我曾尝试调查“全球”对象,但没有运气。如果我确实找到了这个构造函数,我可以用
spyOn(global, 'falcor').andReturn(/* object with a mocked get method*/);
替换它吗?
有没有更好的方法让测试更容易从另一个路由内部调用一个路由?
感谢您的帮助。
【问题讨论】:
【参考方案1】:从问题 2 开始:是的,要从另一个路由获取数据,请将 refs 返回到该路由。不要用路由实例化另一个模型。例如
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
【讨论】:
以上是关于如何在 Jasmine 1 中监视 Falcor 数据模型构造函数的主要内容,如果未能解决你的问题,请参考以下文章
使用 Jasmine 监视 Backbone.js 路由调用