2016-09-19 57 views
0

我试图用proxyquire来替换我正在测试的模块中的一个方法调用,但是它调用了方法,尽管事实上我有存根设置。我究竟做错了什么?proxyquire不是存根方法调用

formsReducer.test.js:

import { expect } from 'chai'; 
import * as actions from '../actions/formsActions'; 
import * as types from '../constants/actionTypes'; 
import proxyquire from 'proxyquire'; 

describe('Forms Reducer',() => { 
    describe('types.UPDATE_PRODUCT',() => { 
     it('should get new form blueprints when the product changes',() => { 
      //arrange 
      const initialState = { 
       blueprints: [ 
        { 
         id: 1, 
         categoryId: 1, 
         identifier: null, 
         name: "Investment Policy Statement", 
         sortGroup: 1, 
         wetSignRequired: false 
        } 
       ] 
      }; 
      const testBlueprints = [{ id: 999, categoryId: 1, name: "Form Blueprint Loaded From Product ID 1", sortGroup: 1, wetSignRequired: false }]; 
      //use proxyquire to stub call to formsHelper.getFormsByProductId 
      let formsReducer = proxyquire.noCallThru().load('./formsReducer', { 
       formsHelper: { 
       getFormsByProductId: id => { return testBlueprints } 
       } 
      }).default; 
      const action = { 
       type: types.UPDATE_PRODUCT, 
       product: { 
        id: 1, 
        accountTypeId: 1, 
        officeRangeId: 1, 
        additionalInfo: "", 
        enabled: true 
       }, 
      }; 
      //act 
      const newState = formsReducer(initialState, action); 
      //assert 
      expect(newState.blueprints).to.be.an('array'); 
      expect(newState.blueprints).to.equal(testBlueprints); 
     }); 
    }); 
}); 

formsReducer.js:

import * as types from '../constants/actionTypes'; 
import objectAssign from 'object-assign'; 
import initialState from './initialState'; 
import formsHelper from '../utils/FormsHelper'; 
export default function formsReducer(state = initialState.forms, action) { 
    switch (action.type) { 
    case types.UPDATE_PRODUCT: { 
     let formBlueprints = formsHelper.getFormsByProductId(action.product.id); 
     formBlueprints = formsHelper.addOrRemoveMnDisclosure(formBlueprints, action.stateOfResidence.id); 
     return objectAssign({}, state, {blueprints: formBlueprints, instances: []}); 
    } 
} 

formsHelper.getFormsByProductId没有返回testBlueprints因为它应该好像它是通过适当的存根proxyquire。我究竟做错了什么?

+0

我有一种感觉,这是因为'.default'当你加载它。你用babel来测试你的测试代码吗?你可以编辑你的问题,包括标题部分与您的需求/进口?另外,您可以尝试'./node_modules/.bin/mocha --compilers js:babel-core/register'作为您的npm测试脚本。 –

+0

嗨,马里奥,我使用'.default',因为如果我不这样做,'.load('./ formsReducer')'返回下面的内容(这不是一个函数 - 我用'console.log'来得到这个) :'{default:[Function:formsReducer]}' - 当我试图在测试中使用这个函数时,我得到一个错误。我编辑了我的问题,按照您的要求包含需求和导入 - 看看是否有助于您进一步诊断问题。 – Tylerlee12

回答

0

formsReducer.js正在导入../utils/FormsHelper,但proxyquire试图替换formsHelper。尝试改变代理︰

proxyquire.noCallThru().load('./formsReducer', { 
    '../utils/FormsHelper': { 
    getFormsByProductId: id => { return testBlueprints } 
    } 
}) 
+0

当我使用'../ utils/FormsHelper'而不是小写版本时,这工作。然而,它需要我为'formsHelper.addOrRemoveMnDisclosure'创建一个存根 - 如果我没有,我得到以下错误:'TypeError:_FormsHelper2.default.addOrRemoveMnDisclosure不是一个函数' - 这看起来是一个babel某种错误?在''proxyquire''文档中,它声明我只需要替换我想要的密钥和我不替换的密钥就可以保留它们的原始功能。 – Tylerlee12

+0

你说得对,我打错了文件路径。我现在修好了。我认为这些文档意味着您可以在保留其他文件的同时获取一些文件。您可以执行'proxyquire.noCallThru()。load('./ formsReducer',{'../utils/FormsHelper':{getFormsByProductId:id => {return testBlueprints},addOrRemoveMnDisclosure:require('../ utils/FormsHelper ').addOrRemoveMnDisclosure}});'。 –