2016-10-07 23 views
5

Ich versuche enzyme zu verwenden, um DOM-Knoten zu aktivieren. Meine Component sieht aus wieTypeError: Kann die Eigenschaft 'equal' von undefined nicht lesen

import React, {Component} from 'react'; 
import TransactionListRow from './TransactionListRow'; 
import {Table, TableBody, TableHeader, TableHeaderColumn, TableRow} from 'material-ui/Table'; 

export default class TransactionList extends Component { 
    render() { 
    const { transactions } = this.props; 

    return (
     <Table> 
     <TableHeader displaySelectAll={false}> 
      <TableRow> 
      <TableHeaderColumn>Name</TableHeaderColumn> 
      <TableHeaderColumn>Amount</TableHeaderColumn> 
      <TableHeaderColumn>Transaction</TableHeaderColumn> 
      <TableHeaderColumn>Category</TableHeaderColumn> 
      </TableRow> 
     </TableHeader> 
     <TableBody> 
      {transactions.map(transaction => 
      <TransactionListRow key={transaction.id} transaction={transaction}/> 
     )} 
     </TableBody> 
     </Table> 
    ); 
    } 
}; 

Mein test sieht aus wie

import expect from 'expect'; 
import React from 'react'; 
import {mount} from 'enzyme'; 
import TransactionList from '../TransactionList'; 
import {TableHeaderColumn} from 'material-ui/Table'; 
import getMuiTheme from 'material-ui/styles/getMuiTheme'; 

describe("<TransactionList />",() => { 
    const mountWithContext = (node) => mount(node, { 
    context: { 
     muiTheme: getMuiTheme(), 
    }, 
    childContextTypes: { 
     muiTheme: React.PropTypes.object.isRequired, 
    } 
    }); 


    it('renders five <TableHeaderColumn /> components',() => { 
    const wrapper = mountWithContext(<TransactionList transactions={[]}/>) 

    console.log(wrapper.html()); 
    // expect(wrapper.find('thead').length).toBe(1); 
    expect(wrapper.contains(<TableHeaderColumn>Name</TableHeaderColumn>)).to.equal(true) 
    }); 
}); 

Als ich das laufen, ich

● <TransactionList /> › renders five <TableHeaderColumn /> components 

    TypeError: Cannot read property 'equal' of undefined 

     at Object.<anonymous> (src/components/transactions/__tests__/TransactionList.test.js:24:250) 
     at process._tickCallback (internal/process/next_tick.js:103:7) 

erhalten Per Enzymedocs,

.contains() expects a ReactElement, not a selector (like many other methods). Make sure that when you are calling it you are calling it with a ReactElement or a JSX expression.

Was mache ich falsch?

Dank

UPDATE
entfernte ich die import expect from 'expect und lief als

import React from 'react'; 
import {mount} from 'enzyme'; 
import TransactionList from '../TransactionList'; 
import TableHeaderColumn from 'material-ui/Table'; 
import getMuiTheme from 'material-ui/styles/getMuiTheme'; 

describe("<TransactionList />",() => { 
    const mountWithContext = (node) => mount(node, { 
    context: { 
     muiTheme: getMuiTheme(), 
    }, 
    childContextTypes: { 
     muiTheme: React.PropTypes.object.isRequired, 
    } 
    }); 


    it('renders five <TableHeaderColumn /> components',() => { 
    const wrapper = mountWithContext(<TransactionList transactions={[]}/>) 

    // console.log(wrapper.html()); 
    expect(wrapper.find('thead').length).toBe(1); 
    expect(wrapper.find('td').length).toBe(0); 

    // this is not working 
    expect(wrapper.contains(<TableHeaderColumn/>)).toEqual(true); 
    }); 
}); 

Es

FAIL src/components/transactions/__tests__/TransactionList.test.js 
    ● <TransactionList /> › renders five <TableHeaderColumn /> components 

    expect(received).toEqual(expected) 

    Expected value to equal: 
     true 
    Received: 
     false 

     at Object.<anonymous> (src/components/transactions/__tests__/TransactionList.test.js:26:164) 

und mit

nun versagt

ich

 Warning: Unknown props `onMouseEnter`, `onMouseLeave`, `onClick` on <th> tag. Remove these props from the element. 
FAIL src/components/transactions/__tests__/TransactionList.test.js 
    ● <TransactionList /> › renders five <TableHeaderColumn /> components 

    TypeError: Cannot read property 'equal' of undefined 

     at Object.<anonymous> (src/components/transactions/__tests__/TransactionList.test.js:26:166) 
     at process._tickCallback (internal/process/next_tick.js:103:7) 

Ich kann immer noch behaupten, nicht auf ReactElement

Antwort

18

Das ist nicht ein Enzyme Problem.

expect(...).to ist undefined, weil Sie expect.js installiert haben und Sie chai Syntax verwenden.

dieser

expect(wrapper.contains(<TableHeaderColumn>Name</TableHeaderColumn>)).to.equal(true) 

sollte

expect(wrapper.contains(<TableHeaderColumn>Name</TableHeaderColumn>)).toEqual(true) 
+0

Danke für die Hilfe, bitte meine Update sehen. Ich bin immer noch verwirrt – daydreamer

+1

Haben Sie versucht mit 'expect (wrapper.find ('TableHeaderColumn'). Länge === 5) .toEqual (true); '/' expect (wrapper.find (TableHeaderColumn) .length === 5) .toEqual (true); '? – QoP

+1

Danke @QoP deine ersten zwei Zeilen haben mir sofort geholfen. Ich vermute, dass dies für jemanden wie mich sehr oft passieren würde, der von Unit Testing mit Expect ging, die Hilfs-Bibliotheken, Chia usw. benutzte und die subtilen Nuancen nicht mit Syntax bemerkte. –

Verwandte Themen