开发者问题收集

可能是我的一个简单玩笑/反应错误

2017-04-03
89

我正在尝试模拟具有以下结构的组件:

//A_Form.js
import React from "react";

export default React.createClass({
    displayname: "A_Form",

    updateState: function() {
        // I want to mock this function as it opens a web connection
    }    
    render: function() {
        return ( 
            <form>
                <div className='class1'>
                    <label htmlFor="name"> name </label>
                </div>
            </form>
    }

我正在尝试使用以下内容通过 jest 进行测试:

//A_Form.spec.js
import React
import {A_Form} from './A_Form';

function mock_A_Form() {
    var A_Form = React.createElement(require.requireActual("./A_Form");
    return {
        ... A_Form,
        updateState: jest.fn( () => { return; } )
    }
jest.mock("./A_Form",() => { return mock_A_Form(); } );

describe("A_Form test",function() {
    var ReactTestUtils = require('react-addons-test-utils');
    var a_form = React.createElement(require.requireMock("./A_Form");

    it("checking",function() {
        var n = "name";
        var rendered_a_form = ReactTestUtils.renderIntoDocument(a_form);
        var my_name = ReactTestUtils.findRenderedDOMComponentWithTag(rendered_a_form,"label");
        expect(my_name.textContent).toBe(n);
    });
});

我想我已经包含了所有相关代码。我被困在调用 renderIntoDocument 中,因为它返回“不变违规:元素类型无效:预期为字符串(用于内置组件)或类/函数(用于复合组件),但得到的是:对象。”。

由于我对 Jest 和 React 还很陌生,任何合理的推动都会受到赞赏。

1个回答

啊,好的,我想我知道发生了什么:

var a_form = React.createElement(require.requireMock("./A_Form");

看起来是引发错误的那一行。 require.requireMock("./A_Form") 生成一个对象( React.createElement 需要一个组件或字符串):

{
    ... A_Form,
    updateState: jest.fn( () => { return; } )
}

如果我理解正确的话,您想要返回一个组件,并使用 updateState 方法覆盖。但是,您最终要做的是生成一个具有 A_Form 的所有方法和字段的对象(如果是这样,我认为您不能解包这样的对象 - 至少对我来说,Babel 会抱怨这种解包)和一个 updateState 方法。

不幸的是,在 React 中并没有真正好的、简单的方法来执行方法覆盖 - 看看 这篇文章 ,我想它会为你指明正确的方向。从高层次上讲,您无需覆盖,只需在创建组件时提供要覆盖的方法即可。

React 中还有用于“真正”OO 的 ……尽管这似乎有点过分。

您可以 尝试 类似

return React.createComponent({ ...A_Form, updateState: () => {}); 
的方法,不过不确定是否会起作用。
Tyler Sebastian
2017-04-03