在 Jest 单元测试中访问 React Component 中的 mobx observable 属性

Accessing mobx observable property in React Component in Jest unit test

下面是我的组件。 mobx 状态只是在组件的主体中,我没有为它创建单独的存储。

我的问题是如何在 jest/enzyme 单元测试中访问那些 mobx 状态变量?

import React, { Component } from 'react';
import { BookIcon } from 'react-octicons-svg';
import { observable } from 'mobx';
import { observer } from 'mobx-react';


@observer
class Wallet extends Component {

    static propTypes = {
        name: React.PropTypes.string,
        wallet: React.PropTypes.object.isRequired
    }

   @observable showPassbook = false;
   @observable wallet = Object.assign({}, this.props.wallet);

    render() {

        const walletTitle = this.wallet.title || this.wallet.wallet_name || this.props.name || "no name";

        return (<div>
                <h2>Wallet for {walletTitle}</h2>
                <div className="row">
                    <div className="col-md">
                        <ul className="list-unstyled mt-2">
                            <li><strong>Balance:</strong> {formatNumber(Number(this.wallet.balance.amount), this.wallet.balance.currency)} {this.wallet.balance.currency}</li>
                            <li><strong>State:</strong> {this.wallet.state}</li>
                        </ul>
                    </div>      
                </div>


                <div> 
                    <button className="btn-link" title="Show Passbook" onClick={() => { this.showPassbook = true; }}><BookIcon /> Show Passbook</button>
                   </div>
                {this.showPassbook && (<div>Passbook</div>)}    
            </div>
        )}
};

export default Wallet;

我的 Jest 单元测试的相关部分是:

it("button to get passbook", function() {
    const wrapper = shallow(<Wallet name="carlos" wallet={walletData}/>)
    console.log("showpassbook", this.showPassbook);
  })

如何在单元测试中访问 mobx 可观察属性? 当前 this.showPassbook 或 wrapper.showPassbook 未定义。

您可以获取包装器的 instance 并访问该字段:

it("button to get passbook", function() {
  const wrapper = shallow(<Wallet name="carlos" wallet={walletData}/>)
  console.log("showpassbook", wrapper.instance().showPassbook);
})