Typescript fetch mock:log语句干扰简单获取结果的解析/失败
当我编写以下代码时,Jest.js通过了测试:Typescript fetch mock:log语句干扰简单获取结果的解析/失败,typescript,jestjs,fetch-mock,Typescript,Jestjs,Fetch Mock,当我编写以下代码时,Jest.js通过了测试: test("internalFetch()", async () => { fetchMock.mock("*", Promise.resolve(JSON.stringify({key1 : "val1"}))); const response = await fetch('http://starMatcher.com', { method : "post" , headers : { "cont
test("internalFetch()", async () => {
fetchMock.mock("*", Promise.resolve(JSON.stringify({key1 : "val1"})));
const response = await fetch('http://starMatcher.com', {
method : "post"
, headers : { "content-type" : "application/json" }
});
// the next line fails the test when uncommented
// console.log(await response.json(), `=====response.json()=====`);
await expect(response.json()).resolves.toStrictEqual({key1 : "val1"});
});
取消对log语句的注释会立即中断测试并在终端中显示
✕ internalFetch() (56ms)
expect(received).resolves.toStrictEqual()
Received promise rejected instead of resolved
Rejected to value: [TypeError: body used already for: http://starmatcher.com/]
191 | console.log(await response.json(), `=====response.json()=====`);
192 |
> 193 | await expect(response.json()).resolves.toStrictEqual({key1 : "val1"});
| ^
194 | });
195 |
196 |
at expect (node_modules/expect/build/index.js:138:15)
at functions/src/classes/__tests__/ScriptTag.test.ts:193:11
at step (functions/src/classes/__tests__/ScriptTag.test.ts:46:23)
at Object.next (functions/src/classes/__tests__/ScriptTag.test.ts:27:53)
at fulfilled (functions/src/classes/__tests__/ScriptTag.test.ts:18:58)
Test Suites: 1 failed, 1 total
Tests: 1 failed, 1 skipped, 9 passed, 11 total
有人知道为什么日志语句会干扰并导致(现在)第二次查找响应时拒绝承诺吗
也尝试过
- 将
fetchMock.post()
切换为使用.mock()
李>
同样的终端错误
- 删除第二个
.json()
执行,并将匹配器切换为not strict
- 上一个示例,但在最后一行添加回
.json()
:
解决方法有两个更改:
在目标文件中导入同构提取
(不是导入节点提取
)而不带命名空间:
导入“同构提取”代码>
删除fetchMock.mock()
的第二个参数中的Promise.resolve
(或其他模拟方法,如.getOnce()
)
test("internalFetch()", async () => {
fetchMock.mock("*", Promise.resolve(JSON.stringify({key1 : "val1"})));
const response = await fetch('http://starMatcher.com', {
method : "post"
, headers : {
"content-type" : "application/json"
}
});
console.log(await response.json(), `=====response.json()=====`);
await expect(response).toEqual({key1 : "val1"});
});
// terminal
internalFetch()
expect(received).toEqual(expected) // deep equality
- Expected
+ Received
- Object {
- "key1": "val1",
+ Response {
+ "size": 0,
+ "timeout": 0,
+ Symbol(Body internals): Object {
+ "body": Object {
+ "data": Array [
+ 123,
+ 34,
+ 107,
+ 101,
+ 121,
+ 49,
+ 34,
+ 58,
+ 34,
+ 118,
+ 97,
+ 108,
+ 49,
+ 34,
+ 125,
+ ],
+ "type": "Buffer",
+ },
+ "disturbed": true,
+ "error": null,
+ },
+ Symbol(Response internals): Object {
+ "counter": undefined,
+ "headers": Headers {
+ Symbol(map): Object {
+ "Content-Length": Array [
+ "15",
+ ],
+ "Content-Type": Array [
+ "text/plain;charset=UTF-8",
+ ],
+ },
+ },
+ "status": 200,
+ "statusText": "OK",
+ "url": "http://starmatcher.com/",
+ },
}
191 | console.log(await response.json(), `=====response.json()=====`);
192 |
> 193 | await expect(response).toEqual({key1 : "val1"});
| ^
194 | });
195 |
196 |
at functions/src/classes/__tests__/ScriptTag.test.ts:193:28
at step (functions/src/classes/__tests__/ScriptTag.test.ts:46:23)
at Object.next (functions/src/classes/__tests__/ScriptTag.test.ts:27:53)
at fulfilled (functions/src/classes/__tests__/ScriptTag.test.ts:18:58)
console.log functions/src/classes/__tests__/ScriptTag.test.ts:191
{ key1: 'val1' } =====response.json()=====
Test Suites: 1 failed, 1 total
Tests: 1 failed, 1 skipped, 9 passed, 11 total
await expect(response.json()).toEqual({key1 : "val1"});
// terminal
expect(received).toEqual(expected) // deep equality
- Expected
+ Received
- Object {
- "key1": "val1",
- }
+ Promise {}
fetchMock.getOnce("*", {fetchMockKey: "fetchMockVal"});
const scriptTagTester = new ScriptTagTester("", "", "x.js");
const result = await scriptTagTester.internalFetch();
const json = await result.json();
expect(json).toEqual({fetchMockKey : 'fetchMockVal'});