【发布时间】:2018-09-20 21:33:51
【问题描述】:
这是this one 的后续问题(无需阅读该问题即可回答此问题)。
以下面的 React 组件为例:
class Greeting extends React.Component {
constructor() {
fetch("https://api.domain.com/getName")
.then((response) => {
return response.text();
})
.then((name) => {
this.setState({
name: name
});
})
.catch(() => {
this.setState({
name: "<unknown>"
});
});
}
render() {
return <h1>Hello, {this.state.name}</h1>;
}
}
使用 Jest,我们可以断言 name 等于从 getName 请求返回的某些文本:
test("greeting name is 'John Doe'", () => {
const fetchPromise = Promise.resolve({
text: () => Promise.resolve("John Doe")
});
global.fetch = () => fetchPromise;
const app = shallow(<Application />);
return fetchPromise.then((response) => response.text()).then(() => {
expect(app.state("name")).toEqual("John Doe");
});
});
但是下面的感觉不对:
return fetchPromise.then((response) => response.text()).then(() => {
expect(app.state("name")).toEqual("John Doe");
});
我的意思是,我在某种程度上复制了测试文件中的实现。
在我的测试中直接调用then() 或catch() 感觉不对。特别是当response.text() 也返回一个承诺并且我有两个链接的then()s 只是为了断言name 等于John Doe。
我来自 Angular,可以调用 $rootScope.$digest() 并在之后进行断言。
难道没有类似的方法可以做到这一点吗?或者有其他方法吗?
【问题讨论】:
-
为什么不把它包装成一个函数呢?我确信已经有一些承诺期望的包装器。
-
@Sulthan 我仍然想了解发生了什么以及为什么需要这样做。
-
看测试,貌似不对。它测试了副作用。实际上,您的架构似乎有问题,这迫使您编写过于复杂的测试。
-
@Sulthan 你将如何测试它?什么是架构,只是出于演示目的的请求?请详细说明一下?
标签: reactjs unit-testing asynchronous jestjs es6-promise