Reactjs 如何使用玩笑正确测试拒绝的承诺? 代码 试验
测试确实强制代码进入方法中的捕获。因此,状态设置为“error” 但在我的测试中,它并没有达到我期望的效果,而是等待承诺被拒绝,然后再测试状态变化。 我不确定在这里尝试什么,我应该使用async/await吗Reactjs 如何使用玩笑正确测试拒绝的承诺? 代码 试验,reactjs,promise,mocking,jestjs,enzyme,Reactjs,Promise,Mocking,Jestjs,Enzyme,测试确实强制代码进入方法中的捕获。因此,状态设置为“error” 但在我的测试中,它并没有达到我期望的效果,而是等待承诺被拒绝,然后再测试状态变化。 我不确定在这里尝试什么,我应该使用async/await吗 因此,我想等待的是createUser方法,但我不确定我的实现是否允许这样做。在您的代码中handleFormSubmit函数应该返回您可以在测试中等待的承诺。此外,您还需要从成功和错误回调中返回真实数据,以分别解决和拒绝承诺 export const createUser = funct
因此,我想等待的是
createUser
方法,但我不确定我的实现是否允许这样做。在您的代码中handleFormSubmit
函数应该返回您可以在测试中等待的承诺。此外,您还需要从成功和错误回调中返回真实数据,以分别解决和拒绝承诺
export const createUser = function() {
return new Promise((resolve, reject) => {
reject('error');
});
};
在实际代码中,您在catch
处理程序中捕获了错误,并试图在测试用例代码中进一步捕获它。因此,catch
无法进一步链接,而您可以多次链接then
请参阅承诺文件:
您的代码看起来是正确的。你为什么说它不等待承诺被拒绝?我唯一能做的不同就是利用Jest的模仿功能,所以改变一下 嘲弄 到 试验
不需要单独的模拟文件,测试失败是因为它不知道主题是异步的。可以通过使用
done
param或使测试功能async
来修复此问题
注意,还需要设置预期断言的数量,这样即使没有执行catch分支,测试也会失败
异步
/等待
样式:
jest.mock('../services');
const services = require('../services');
const createUser = jest.spyOn(services, "createUser");
createUser.mockRejectedValue("error");
...
it('rejects...', () => {
您应该这样做:
it('拒绝…',()=>{
const Container=createUserContainer(CreateUser);
常量包装器=浅();
返回expect(wrapper.instance().handleFormSubmit()).rejects.toEqual('error');
});
我认为这样比较干净。您可以看到这种方法。这并没有解决问题。代码仍然会被捕获,但是测试在运行expectsMy bad之前仍然不会等待承诺实现,它已经用文档链接更新了答案。这肯定会解决你的问题的。。你是如何解决这个问题的?我有相同的代码,需要在承诺完成后进行测试。仅供参考,您不应拒绝字符串。您应该拒绝错误,如
拒绝(新错误('error'))
。注意,您的测试也可以确认该状态。加载仍然设置为true如果测试的目标代码需要使用“新服务”,那么您需要使用requireActual执行jest.doMock,并只覆盖单个函数?这对我非常有帮助。“.catch”风格正是我所需要的。谢谢如果函数没有抛出,这个测试不会给出假阳性吗?@oyalhi不,它不会给出假阳性。行expect.assertions(1)
告诉jest将有一个断言,因此如果没有触发catch
,jest将抱怨缺少断言这是检查异步错误的官方方法。这应该是公认的答案。谢谢你的更正。有两种方法可以做到这一点。我在缺少的断言中添加了return
。但您也可以使用async和Wait来完成。你可以在官方文件中阅读
export const createUser = function() {
return new Promise((resolve, reject) => {
reject('error');
});
};
handleFormSubmit = () => {
this.setState({ loading: true });
return createUser()
.then(() => {
this.setState({
loading: false,
});
return true;
})
.catch(e => {
this.setState({
error: e,
});
throw e;
});
};
export const createUser = function() {
return new Promise((resolve, reject) => {
reject('error');
});
};
jest.mock('../services');
const services = require('../services');
const createUser = jest.spyOn(services, "createUser");
createUser.mockRejectedValue("error");
...
it('rejects...', () => {
it('rejects...', async () => {
expect.assertions(1);
const Container = createUserContainer(CreateUser);
const wrapper = shallow(<Container />);
await wrapper.instance().handleFormSubmit()
.catch(e => {
console.log("State: ", wrapper.state());
expect(e).toEqual('error');
});
});
it('rejects...', done => {
expect.assertions(1);
const Container = createUserContainer(CreateUser);
const wrapper = shallow(<Container />);
wrapper.instance().handleFormSubmit()
.catch(e => {
console.log("State: ", wrapper.state());
expect(e).toEqual('error');
done();
});
});