2017-05-22 115 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