我是开玩笑/酶的新手,正尝试模拟对返回Promise的aync函数的调用,该调用是在componentDidMount方法的react组件内进行的。
该测试正在尝试测试componentDidMount将Promise返回的数组设置为状态。
我遇到的问题是,在将数组添加到状态之前,测试已完成并通过。我正在尝试使用“完成”回调来使测试等待,直到承诺解决为止,但这似乎不起作用。
我尝试将Expect调用移至done()调用之前的那一行,但这似乎也不起作用。
谁能告诉我我在做什么错?
正在测试的组件:
componentDidMount() {
this.props.adminApi.getItems().then((items) => {
this.setState({ items});
}).catch((error) => {
this.handleError(error);
});
}
我的测试:
import React from 'react';
import { mount } from 'enzyme';
import Create from '../../../src/views/Promotion/Create';
import AdminApiClient from '../../../src/api/';
jest.mock('../../../src/api/AdminApiClient');
describe('view', () => {
describe('componentDidMount', () => {
test('should load items into state', (done) => {
const expectedItems = [{ id: 1 }, { id: 2 }];
AdminApiClient.getItems.mockImplementation(() => {
return new Promise((resolve) => {
resolve(expectedItems);
done();
});
});
const wrapper = mount(
<Create adminApi={AdminApiClient} />
);
expect(wrapper.state().items).toBe(expectedItems);
});
});
});
您的测试有两个问题。首先,你不能这样嘲笑AdminApiClient
。jest.mock
将用just替换模块undefined
,因此getItems.mockImplementation
将无效或抛出错误。同样也不需要使用原始的。通过道具将其作为参数传递时,您可以在测试中直接创建on模拟。其次,如果您使用诺言,则必须从测试中返回诺言或使用async/await
(docs):
it('', async() = > {
const expectedItems = [{ id: 1 }, { id: 2 }];
const p = Promise.resolve(expectedItems)
AdminApiClient = {
getItems: () = > p
}
const wrapper = mount(
<Create adminApi={AdminApiClient} />
);
await p
expect(wrapper.state().items).toBe(expectedItems);
})
问题内容: Jest提供了一种模拟函数的方法,如其文档中所述 但是,这些模拟仅在直接在测试中调用函数时才起作用。 如果我有一个这样定义的React Component,该如何模拟呢? 我不知道如何制作它,所以组件调用了我的模拟实现,以便我可以测试它是否可以正确地呈现数据。 (这是一个简化的,人为的示例,目的是为了了解如何模拟在React组件内部调用的函数) 编辑:api.js文件,为清楚起见 问题
问题内容: 我有一个React组件(为了演示该问题,对此进行了简化): 现在,我要测试提供的值的调用。 为此,我想创建一个代替组件方法的笑话模拟函数。 到目前为止,这是我的测试用例: 但是我在控制台中得到的只是: 语法错误 所以我的问题是,如何正确地用酶模拟组分方法? 问题答案: 可以通过以下方式模拟该方法: 您还需要在被测组件的包装器上调用.update,以便正确注册模拟功能。 语法错误来自错误
问题内容: 首先,我是和的新手。 我有一个实例化的类,我想测试一下。 这是我的代码: 我想测试一下我的功能。我的头,我认为测试fs.existsSync的状态是个好主意。如果返回,则必须调用。所以我尝试写一些测试: 但是,我有一个错误: 您能帮我调试和测试我的功能吗? 问候。 问题答案: 出现错误是因为它正在寻找在您的对象上调用的方法,该方法不存在。如果您可以访问测试中的模块,则可以监视如下方法:
问题内容: 我想嘲笑localStorage方法以进行错误模拟。我在Utility.js中定义了localstorage getter和setter方法。我想嘲笑在调用时抛出错误。 开玩笑, 但是模拟永远不会被调用。我也尝试过 问题答案: 这与Andreas在答案中建议的一致,但是我能够使用Storage接口对其进行模拟。我做了这样的事情 开玩笑, 这次公关讨论也很有帮助。
我有下面的打字稿类,我想测试在笑话。 这是我的测试: 如何模拟MyClass中使用的foo函数,以使测试通过?
问题内容: 我有一个依赖于导出变量的文件。此变量设置为,但是如果需要,可以将其设置为手动设置,以防止下游服务请求时出现某些行为。 我不确定如何在Jest中模拟变量,以便更改测试和条件的值。 例: 问题答案: 如果将ES6模块语法编译为ES5,则此示例将起作用,因为最后,所有模块导出都属于同一对象,可以对其进行修改。 另外,您可以切换到raw commonjs 函数,并借助以下方法做到这一点: