【发布时间】:2019-08-01 15:40:24
【问题描述】:
我正在尝试测试由我的代码之外的模块返回的承诺,该模块使用 axios.create 进行调用。为了测试它是否正在查看 .then 和 .catch 我只是再次设置状态,但它没有考虑到这一点。为了测试 .then 和 .catch 内部发生了什么,我到底需要告诉 Jest 做什么?
我曾尝试模拟模块并监视“get”方法,但它们都不起作用。
文件.jsx
import React, { Component } from 'react';
import { request } from '../../../../global/Helper';
class File extends Component {
constructor() {
This.state = {
isLoading: false,
number: 5
}
}
componentDidMount() {
this.fetchStates();
};
fetchStates = () => {
this.setState({isLoading: true});
request.get('/api/state/')
.then(response => {
this.setState({ number: 10 });
})
.catch((err) => {
this.setState({ number: 15 });
});
};
};
export { ProfileEdit };
Helper.js
import axios from 'axios';
let request = axios.create({
baseURL: `${process.env.BASE_URL}`,
headers: {
'Content-Type': 'application/json'
},
withCredentials: true,
crossDomain: true,
responseType: 'json'
});
export { request };
文件.test.jsx
import React from 'react';
import * as Helper from '../../../../global/Helper';
import { File } from './File';
describe('File', () => {
const props = {
location: {
state: {
}
},
};
it('should set the state twice', (done) => {
// Arrange
let component = mount(<ProfileEdit {...props}/>).instance();
let setStateSpy = spyOn(ProfileEdit.prototype, 'setState');
jest.spyOn(Helper.request, 'get').mockResolvedValue();
// Act
component.fetchStates();
//Assert
expect(setStateSpy).toHaveBeenCalledWith(jasmine.objectContaining({ number: 10 }));
done();
});
});
我希望 setstate 被调用两次,但它只调用一次。
这是我收到的错误消息:
expect(spy).toHaveBeenCalledWith(expected)
Expected spy to have been called with:
ObjectContaining {"number": 10}
as argument 1, but it was called with
{"isLoading": true}.
Difference:
- Expected
+ Received
- ObjectContaining {
- "number": 10,
+ Object {
+ "isLoading": true,
}
46 | component.fetchStates();
47 |
> 48 | expect(setStateSpy).toHaveBeenCalledWith(jasmine.objectContaining({ number: 10 }));
| ^
49 | done();
50 | });
51 | });
【问题讨论】:
-
您为什么希望
setState()被调用两次?在您的测试期间,这些调用应该发生在哪里?哪几行?另外我建议直接针对组件的状态进行预期,那么您不必监视 setState()。 -
@Code-Apprentice 我忘了补充说我正在设置请求之前的状态。我遇到的主要问题是,即使我尝试使用“mockFn.mockResolvedValue(value)”,我也找不到测试 .then 内部内容的方法。
标签: javascript reactjs unit-testing jestjs axios