2016-09-19 3 views
0

Я пытаюсь использовать proxyquire, чтобы заменить вызов метода в модуле, который я тестирую, но он вызывает метод, несмотря на то, что у меня установлен заглушка. Что я делаю не так?proxyquire not stubbing метод call

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}}); '. –

 Смежные вопросы

  • Нет связанных вопросов^_^