wrapper.find无法找到FormInput(ReactJs + Enzyme)。

问题描述 投票:0回答:1

我有一个简单的测试案例,在这里我检查FormInput是否存在。我在终端得到以下结果

Expected length: 1
Received length: 0
Received object: {}

这里是测试用例。我还做了一个wrapper.debug()来看看我作为wrapper得到了什么。

it('renders FormInput component', () => {
      console.log(wrapper.debug())
      expect(wrapper.find(FormInput)).toHaveLength(1)
    })

下面是console.log的结果,你可以看到FormInput是存在的,但是测试用例还是失败了。你可以看到FormInput在这里存在,但测试用例仍然失败。任何建议帮助是感激的。

import Immutable from 'immutable'

import * as actions from '../actions'

import reducer from '../reducer'
import { InitialState } from '../reducer'
import { payeeUtils } from '../../../utils/payee-utils'
import PayeeRecord from '../../../records/PayeeRecord'

describe('When using payee details Reducer', () => {
  let initialState, state, previousState

  beforeAll(function() {
    initialState = new InitialState()
    state = initialState
  })

  beforeEach(function() {
    previousState = new InitialState(state)
  })

  it('should initialize the state', () => {
    const action = {}
    expect(reducer(undefined, action)).toEqual(initialState)
  })

  it('should set the payees when setPayeesLoadedTo() is called', () => {
    const testData = {
      payees: [
        {
          'id': '10006',
          'defaultFundingAccount': {
            'id': '1001',
            'name': 'Checking 2',
            'accountNumberMasked': '....1235',
            'balance': '$4,045.65',
            'balanceLabel': 'Available balance',
            'selected': false,
            'defaultForCustomer': true,
            'pendingPayments': '547.82',
            'projectedBalance': '$3,497.83',
            'projectedBalanceLabel': 'Projected balance',
            'termsDisplayed': false,
            'sdpEligible': true
          },
          'sendOnDate': '4/23/2018',
          'secureUrlList': [
            {
              'action': 'make-payment',
              'url': '/billpay/payment/make/10005'
            },
            {
              'action': 'get-reminder',
              'url': '/billpay/reminder/10005'
            }
          ],
          displayStatus: true,
          paymentDue: true,
          ebillStatus: 'ACTIVE',
          defaultFundingAccountId: '1001',
          'cuiPaymentHistoryUrl': '/exit/saml;identifier=cui_PayeeHistory;payeeId=10005'
        },
        {
          'id': '20006',
          'defaultFundingAccount': {
            'id': '1002',
            'name': 'Checking 2',
            'accountNumberMasked': '....1235',
            'balance': '$4,045.65',
            'balanceLabel': 'Available balance',
            'selected': false,
            'defaultForCustomer': true,
            'pendingPayments': '547.82',
            'projectedBalance': '$3,497.83',
            'projectedBalanceLabel': 'Projected balance',
            'termsDisplayed': false,
            'sdpEligible': true
          },
          'sendOnDate': '4/23/2018',
          'secureUrlList': [
            {
              'action': 'make-payment',
              'url': '/billpay/payment/make/10005'
            },
            {
              'action': 'get-reminder',
              'url': '/billpay/reminder/10005'
            }
          ],
          displayStatus: false,
          paymentDue: false,
          ebillStatus: 'PENDING_DEACTIVATION',
          defaultFundingAccountId: '1002',
          'cuiPaymentHistoryUrl': '/exit/saml;identifier=cui_PayeeHistory;payeeId=10005'
        }
      ],
      accounts: [
        {
          'id': '1001',
          'name': 'Checking 1',
          'accountNumberMasked': '....1234',
          'balance': '$820.65',
          'balanceLabel': 'Available balance',
          'selected': false,
          'defaultForCustomer': false,
          'termsDisplayed': false,
          'sdpEligible': true,
          'overdraftProtected': true
        },
        {
          'id': '1002',
          'name': 'Checking 2',
          'accountNumberMasked': '....1234',
          'balance': '$820.65',
          'balanceLabel': 'Available balance',
          'selected': false,
          'defaultForCustomer': false,
          'termsDisplayed': false,
          'sdpEligible': true,
          'overdraftProtected': true
        }
      ],
      payeesPaymentAmount: Immutable.Map({})
    }
    const action = actions.setPayees(testData)
    const { payeeData: arrangedPayeeData } = payeeUtils.arrangePayees(testData, {}, 0, state.payees)
    const payees = arrangedPayeeData.payees.map(payee => new PayeeRecord(payee))
    const payee1 = payees.find(payee => payee.id === '10006')
    state = reducer(state, action)
    const { defaultFundingAccount, defaultFundingAccountId, isDefaultFundingAccountIneligible, defaultFundingAccountMaskedNumber, defaultFundingAccountNickname } = payee1
    expect(state.payees).toEqual(Immutable.List(payees))
    expect(state.payeeTabFilterOptions).toEqual(Immutable.List(['payees', 'hiddenPayees', 'payeesWithEbills', 'paymentDue', { defaultFundingAccount, defaultFundingAccountId, isIneligible: isDefaultFundingAccountIneligible, isDefaultFundingAccountIneligible, defaultFundingAccountMaskedNumber, value: isDefaultFundingAccountIneligible ? defaultFundingAccountMaskedNumber : defaultFundingAccountId, defaultFundingAccountNickname }]))
    expect(state.selectedPayeeTabFilterOption).toEqual(undefined)
  })

  it('should set selectedPayeeTabFilterOption when setPayeeTabFilterOption action is called', () => {
    const action = actions.setPayeeTabFilterOption('hiddenPayees')
    state = reducer(state, action)
    expect(state.selectedPayeeTabFilterOption).toEqual('hiddenPayees')
    expect(state.payeesTabSearchValue).toEqual('')
  })

  it('should reset selectedPayeeTabFilterOption bar when resetPayeeTabFilterOption action is called', () => {
    const action = actions.resetPayeeTabFilterOption()
    state = reducer(state, action)
    expect(state.selectedPayeeTabFilterOption).not.toBeDefined()
  })

  it('should set payeesTabSearchValue when setPayeesTabSearchValue action is called', () => {
    const action = actions.setPayeesTabSearchValue('F')
    state = reducer(state, action)
    expect(state.payeesTabSearchValue).toEqual('F')
  })

  it('should reset touched payees when resetTouchedPayees action is called', () => {
    const action = actions.resetTouchedPayees()
    state = reducer(state, action)
    const touchedPayees = state.payees.filter(payee => payee.touched)
    const payeeWithDefaultAccountSetToTrue = state.payees.filter(payee => payee.isDefaultAccount)
    expect(touchedPayees.size).toEqual(0)
    expect(payeeWithDefaultAccountSetToTrue.size).toEqual(0)
  })

  it('should set payees failure message when setPayeesFailureMessage is called', () => {
    const action = actions.setPayeesFailureMessage({
      payments: {
        inProcessPaymentList: [{
          paymentIndex: '1',
          payeeId: '10006',
          failureMessageBean: {
            globalMessages: [],
            fieldMessages: [{
              fieldNames: ['amount'],
              message: 'Please enter amount'
            }]
          }
        }]
      }
    })
    state = reducer(state, action)
    expect(state.payees.get(0).failureMessageBean).toEqual(Immutable.fromJS({
      globalMessages: [],
      fieldMessages: [{
        fieldNames: ['amount'],
        message: 'Please enter amount'
      }]
    }))
  })

  it('should reset all payees failure message when resetPayeesFailureMessage is called', () => {
    const action = actions.resetPayeesFailureMessage()
    state = reducer(state, action)
    const expectedFailureMessageBean = Immutable.fromJS({
      globalMessages: [],
      fieldMessages: []
    })
    state.payees.forEach(payee => {
      expect(payee.failureMessageBean).toEqual(expectedFailureMessageBean)
    })
  })

  it('should disable submit bar when disablePayeesSubmitBar action is called', () => {
    const action = actions.disablePayeesSubmitBar()
    state = reducer(state, action)
    expect(state.enableSubmitBar).toBeFalsy()
  })

  it('should set the changedDefaultFundingAccount and id when setPayeeFundingAccount action is called', () => {
    const payload = { account: Immutable.Map({ id: '4' }), payeeId: '10006', isDefaultAccount: false }
    const action = actions.setPayeeFundingAccount(payload)
    state = reducer(state, action)
    const payee = state.payees.find(payee => payee.id === '10006')
    expect(payee.changedDefaultFundingAccount).toEqual(payload.account)
    expect(payee.changedDefaultFundingAccountId).toBe(payload.account.id)
    expect(payee.isDefaultAccount).toBe(payload.isDefaultAccount)
  })

  it('should increment expeditedPaymentsCount when incrementExpeditedPaymentsCount action is called', () => {
    const action = actions.incrementExpeditedPaymentsCount()
    state = reducer(state, action)
    expect(state.expeditedPaymentsCount).toBe(1)
  })

  it('should decrement expeditedPaymentsCount when decrementExpeditedPaymentsCount action is called', () => {
    const action = actions.decrementExpeditedPaymentsCount()
    state = reducer(state, action)
    expect(state.expeditedPaymentsCount).toBe(0)
  })

  it('sets expeditedPaymentsCount to zero when expeditedPaymentsCount is less than one and decrementExpeditedPaymentsCount action is called', () => {
    const action = actions.decrementExpeditedPaymentsCount()
    state = reducer(state, action)
    expect(state.expeditedPaymentsCount).toBe(0)
  })

  it('should reset expeditedPaymentsCount when resetExpeditedPaymentsCount action is called', () => {
    const action = actions.resetExpeditedPaymentsCount()
    state = state.merge({ expeditedPaymentsCount: 5 })
    expect(state.expeditedPaymentsCount).toBe(5)
    state = reducer(state, action)
    expect(state.expeditedPaymentsCount).toBe(0)
  })

  it('should reset change funding account information when resetChangedAccountTouchedPayeeIds action is called', () => {
    const payload = { account: Immutable.Map({ id: '4' }), payeeId: '10006', isDefaultAccount: false }
    const changeFuncdingAccountAction = actions.setPayeeFundingAccount(payload)
    state = reducer(state, changeFuncdingAccountAction)
    const action = actions.resetChangedAccountTouchedPayeeIds()
    state = reducer(state, action)
    expect(state.payees.filter(payee => payee.changedDefaultFundingAccount).size).toBe(0)
  })

  it('should set send on date field message when PAYEES_SET_PAYEE_CARD_SEND_ON_DATE_FIELD_MESSAGES action is dispatched', () => {
    const payeeId = '10006'
    const fieldMessage = { message: 'mockMessage' }
    const action = actions.setPayeeCardSendOnDateFieldMessage(payeeId, fieldMessage)
    state = reducer(state, action)
    const payeeFieldMessages = state.payees.find(payee => payee.id === payeeId).toJS().failureMessageBean.fieldMessages
    payeeFieldMessages.filter(message => message.message === 'mockMessage')
    expect(payeeFieldMessages.filter(message => message.message === 'mockMessage')).toHaveLength(1)
  })

  it('should reset send on date field message when PAYEES_SET_PAYEE_CARD_SEND_ON_DATE_FIELD_MESSAGES action is dispatched', () => {
    const payeeId = '10006'
    const fieldMessage = { message: 'mockMessage', fieldNames: ['sendOnDate'] }
    const action = actions.setPayeeCardSendOnDateFieldMessage(payeeId, fieldMessage)
    state = reducer(state, action)
    const resetAction = actions.removePayeeCardSendOnDateFieldMessage(payeeId)
    state = reducer(state, resetAction)
    const payeeFieldMessages = state.payees.find(payee => payee.id === payeeId).toJS().failureMessageBean.fieldMessages
    payeeFieldMessages.filter(message => message.message === 'mockMessage')
    expect(payeeFieldMessages.filter(message => message.message === 'mockMessage' && (message.fieldNames || []).indexOf('sendOnDate') >= 0 )).toHaveLength(0)
  })

  it('should set hide zelle option for payee when PAYEES_HIDE_ZELLE_OPTION action is dispatched', () => {
    const payeeId = '10006'
    const action = actions.hideZelleOption(payeeId)
    state = reducer(state, action)
    const updatedPayee = state.payees.find(payee => payee.id === payeeId).toJS()
    expect(updatedPayee.hideZelleOption).toBeTruthy()
  })

  it('should set payee card message when PAYEES_SET_PAYEE_CARD_MESSAGES action is dispatched', () => {
    const payeeId = '10006'
    const mockMessage = { message: 'mockMessage' }
    const action = { type: actions.PAYEES_SET_PAYEE_CARD_MESSAGES, messages: { [payeeId]: mockMessage } }
    state = reducer(state, action)
    const updatedPayee = state.payees.find(payee => payee.id === payeeId).toJS()
    expect(updatedPayee.cardMessages).toEqual(mockMessage)
  })

  it('should add payee to expedited payment payees list when PAYESS_TAB_ADD_EXPEDITE_PAYMENTS_PAYEES_LIST is dispatched', () => {
    const payeeId = '10006'
    const action = { type: actions.PAYESS_TAB_ADD_EXPEDITE_PAYMENTS_PAYEES_LIST, payeeId }
    state = reducer(state, action)
    expect(state.toJS().expeditedPaymentPayeesList.has(payeeId)).toBeTruthy()
  })

  it('should delete payee from expedited payment payees list when PAYESS_TAB_DELETE_EXPEDITE_PAYMENTS_PAYEES_LIST is dispatched', () => {
    const payeeId = '10006'
    const action = { type: actions.PAYESS_TAB_DELETE_EXPEDITE_PAYMENTS_PAYEES_LIST, payeeId }
    state = reducer(state, action)
    expect(state.toJS().expeditedPaymentPayeesList.has(payeeId)).toBeFalsy()
  })

  it('should remove all payee from expedited payment payees list when PAYESS_TAB_CLEAR_EXPEDITE_PAYMENTS_PAYEES_LIST is dispatched', () => {
    const payeeId = '10006'
    state = reducer(state, { type: actions.PAYESS_TAB_ADD_EXPEDITE_PAYMENTS_PAYEES_LIST, payeeId })
    const action = { type: actions.PAYESS_TAB_CLEAR_EXPEDITE_PAYMENTS_PAYEES_LIST }
    state = reducer(state, action)
    expect(state.toJS().expeditedPaymentPayeesList.size).toEqual(0)
  })  
})
javascript reactjs testing jestjs enzyme
1个回答
0
投票

这实际上取决于你的包装器是如何创建的。如果你使用的是 mount 你将不得不添加更多的代码片段以更好地理解。如果您使用的是 shallow 我看你可以面对这个问题,因为你是用HOC包装导出的组件。

import Memo from './index';
import { shallow } from 'enzyme';
import FormInput from '../../with-dirty-check/FormInput'

describe("Memo", () => {
  //if component is created like below test case won't pass since you have HOC wrapping your actual component (shallow render one level)
  const wrapper = shallow(<Memo isConfirm={false} />);
  wrapper.find(FormInput).toExist();
})

//to fix
describe("Memo", () => {
  const wrapper = shallow(<Memo isConfirm={false} />).dive();
  wrapper.find(FormInput).toExist();
})

//If you are using mount this should ideally work.
describe("Memo", () => {
  const wrapper = mount(<Memo isConfirm={false} />);
  wrapper.find(FormInput).toExist();
})
© www.soinside.com 2019 - 2024. All rights reserved.