标签: enzyme

如何让Jest等待所有异步代码在期望断言之前完成执行

我正在为React应用程序编写集成测试,即一个测试多个组件的测试,我想模拟对外部服务的任何调用.

问题是测试似乎在执行异步回调之前执行,导致我的测试失败.

有没有办法解决?我可以以某种方式等待调用异步代码完成?

这是一些不好的代码来说明我的观点.

我想测试当我挂载Parent时,它的Child组件呈现从外部服务返回的内容,我将模拟.

class Parent extends component
{
     render ()
     {
         <div>
            <Child />
         </div>
     }
}
class Child extends component
{
     DoStuff()
     {
         aThingThatReturnsAPromise().then((result) => {
           Store.Result = result
         })
     }

    render()
    {
       DoStuff()
       return(<div>{Store.Result}</div>)


    }
}
function aThingThatReturnsAPromise()
{
     return new Promise(resolve =>{
          eternalService.doSomething(function callback(result) {
               resolve(result)
          }
    }

}
Run Code Online (Sandbox Code Playgroud)

当我在测试中执行此操作时,它会失败,因为它会在回调被触发之前执行.

jest.mock('eternalService', () => {
    return jest.fn(() => {
        return { doSomething: jest.fn((cb) => cb('fakeReturnValue');
    });
});

describe('When rendering Parent', () => {
    var …
Run Code Online (Sandbox Code Playgroud)

mocking reactjs jestjs enzyme

27
推荐指数
2
解决办法
2万
查看次数

如何使用 Jest 正确测试被拒绝的承诺?

代码

import { createUser } from '../services';
...
...

handleFormSubmit = () => {  
  this.setState({ loading: true });
  createUser()
    .then(() => {
      this.setState({
        loading: false,
      });
    })
    .catch(e => {
       this.setState({
         error: e,
       });
    });
};
Run Code Online (Sandbox Code Playgroud)

测试

 it('rejects...', () => {
    const Container = createUserContainer(CreateUser);
    const wrapper = shallow(<Container />);  

    return wrapper.instance().handleFormSubmit()
      .catch(e => {
         console.log("State: ", wrapper.state());
         expect(e).toEqual('error');
      });
 });
Run Code Online (Sandbox Code Playgroud)

嘲笑

export const createUser = function() {
  return new Promise((resolve, reject) => {
    reject('error');
  });
};
Run Code Online (Sandbox Code Playgroud)

测试确实强制代码进入方法中的捕获。所以状态确实被设置为“错误”。

但是在我的测试中,它没有按照我的预期进行操作,而是在测试状态更改之前等待 Promise …

mocking promise reactjs jestjs enzyme

27
推荐指数
3
解决办法
3万
查看次数

TypeError:无法读取undefined的属性'prepareStyles'

我的Component样子

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

const TransactionList = ({transactions}) => {
  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>
  );
};

TransactionList.propTypes = {
  transactions: PropTypes.array.isRequired
};

export default TransactionList;
Run Code Online (Sandbox Code Playgroud)

测试是

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

describe("<TransactionList />", ()=> {
  it('renders …
Run Code Online (Sandbox Code Playgroud)

javascript reactjs material-ui enzyme

26
推荐指数
2
解决办法
2万
查看次数

如何用酶测试子成分方法?

我有一个这样的组件:

<Parent>
  <Child/>
</Parent>
Run Code Online (Sandbox Code Playgroud)

<Child/>组件有一个方法foo.我想测试foo方法,但我不知道如何访问它.我试过了:

mount(<Parent><Child/></Parent>).props().children.foo
Run Code Online (Sandbox Code Playgroud)

要么

mount(<Parent><Child/></Parent>).children().foo
Run Code Online (Sandbox Code Playgroud)

但他们都是undefined.我无法使用,.instance()因为它不是root.我无法挂载<Child/>只是因为<Parent>添加了一些东西(react-router's context.router),context而我在init时需要它们<Child/>.有这个想法吗?

javascript reactjs react-router enzyme

24
推荐指数
2
解决办法
1万
查看次数

如何用酶测试反应路由器

我正在使用酶+ mocha + chai来测试我的react-redux项目.酶提供浅层测试组分行为.但我没有找到测试路由器的方法.我正在使用react-router如下:

<Router history={browserHistory}>
     ...
        <Route path="nurse/authorization" component{NurseAuthorization}/>
     ...
  </Route>
Run Code Online (Sandbox Code Playgroud)

我想测试这条路线nurse/authorization参考NurseAuthorization组件.如何在reactjs项目中测试它?

EDIT1

react-router用作路由器框架.

mocha.js chai reactjs react-router enzyme

22
推荐指数
1
解决办法
2万
查看次数

22
推荐指数
1
解决办法
6342
查看次数

测试反应组件包含在withRouter中(最好使用jest /酶)

我有一个React组件,它包含在高阶组件withRouter中,如下所示:

module.exports = withRouter(ManageProfilePage);
Run Code Online (Sandbox Code Playgroud)

我的路线如下:

<Route path="/" component={AdrApp}>
    <IndexRoute component={Login}/>
    <Route component={CheckLoginStatus}>
        <Route path="manage-profiles/:profileId" component=
        {ManageProfilesPage}/>
     </Route>
    <Route path="*" component={notFoundPage}/>
</Route>
Run Code Online (Sandbox Code Playgroud)

我需要使用一次Router生命周期方法,这就是我需要withRouter的原因:

class ManageProfilePage extends React.Component {
    componentDidMount() {
    this.props.router.setRouteLeaveHook(this.props.route, () => {
      ...
    })
    render(){
    ... 
    }
}
Run Code Online (Sandbox Code Playgroud)

我需要使用Jest/Enzyme测试这个组件,我编写了如下测试用例:

describe('manage profile page test suite', () => {


    it('snapshot test', () => {

        const setRouteLeaveHook =jest.fn();

        let wrapper = shallow(
            <ManageProfilePage params={{id : 25, router: 
        setRouteLeaveHook}}/>
        );
      expect(wrapper).toMatchSnapshot();
    })
   }) 
Run Code Online (Sandbox Code Playgroud)

问题是它没有渲染一个层次.我正在粘贴下面的快照:

exports[`manage drug term page test suites snapshot test 1`] …
Run Code Online (Sandbox Code Playgroud)

unit-testing reactjs jestjs react-router enzyme

22
推荐指数
1
解决办法
1万
查看次数

你如何使用浅层测试酶 Reactjs 模拟 useLocation() 路径名?

我有如下标题组件:

import { useLocation } from "react-router-dom";

const Header = () => {
   let route = useLocation().pathname; 
   return route === "/user" ? <ComponentA /> : <ComponentB />;
}
Run Code Online (Sandbox Code Playgroud)

您将如何模拟这个 useLocation() 以获取用户路径?

我不能简单地在我的测试文件中调用 Header 组件,因为我收到错误:

类型错误:无法在 useLocation 读取未定义的属性“位置”

describe("<Header/>", () => {
    it("call the header component", () => {
        const wrapper = shallow(<Header />);
        expect(wrapper.find(ComponentA)).toHaveLength(1);
    });
});
Run Code Online (Sandbox Code Playgroud)

我试过看起来类似于链接如何使用新的反应路由器钩子测试组件?但它没有用。

我试过如下:

const wrapper = shallow(
      <Provider store={store}>
        <MemoryRouter initialEntries={['/abc']}>
          <Switch>
            <AppRouter />
          </Switch>
        </MemoryRouter>
      </Provider>,
    );
    jestExpect(wrapper.find(AppRouter)
      .dive()
      .find(Route)
      .filter({path: '/abc'}) …
Run Code Online (Sandbox Code Playgroud)

reactjs jestjs react-router enzyme

22
推荐指数
3
解决办法
2万
查看次数

如何在 Material UI 文本字段中使用 test-id

我正在尝试使用react-testing-library测试材质 ui 文本字段。

我面临的问题是,为了测试材质 ui textField 我必须使用这个属性方法

screen.getByLabelText()
Run Code Online (Sandbox Code Playgroud)

这是有效的,但是我不想在 UI 上显示标签,我希望标签保持隐藏,因为我已经在使用 Material UI <FormLabel>

我尝试使用 inputProps 并data-testId使用该getByTestId()方法传递元素。但我收到这个错误

TestingLibraryElementError:通过以下方式找到多个元素:[data-testid =“bio”]

(If this is intentional, then use the `*AllBy*` variant of the query (like `queryAllByText`, `getAllByText`, or `findAllByText`)).
Run Code Online (Sandbox Code Playgroud)

editForm.test.tsx

import "@testing-library/jest-dom";
import React from "react";
import { createMount } from "@material-ui/core/test-utils";
import Button from "@material-ui/core/Button";
import Typography from "@material-ui/core/Typography";
import EditProfileForm from "./editForm";
import { render as testRender, fireEvent, screen, getByText } from "@testing-library/react";
const …
Run Code Online (Sandbox Code Playgroud)

reactjs enzyme react-testing-library

22
推荐指数
1
解决办法
3万
查看次数

Jest和酶有什么区别?

我是单元测试的新手.我想测试React项目.当我开始使用React文档时,它将酶称为测试实用程序,这对我来说是一种模糊的.

Jest和之间有什么区别enzyme

  • enzyme断言库还是任务转轮?
  • 我可以karmaJasmine吗?
  • 测试react-redux项目的最佳方法是什么?

javascript jasmine reactjs jestjs enzyme

21
推荐指数
3
解决办法
5229
查看次数