- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试向我的 Node typecipt 项目添加一些 Jest 测试。我想使用 supertest 来调用我的 koa 路由器,同时也使用 fetch-mock 来模拟使用 node-fetch 发出的请求。
到目前为止,我的解决方案如下,但我的路由器中的提取不使用带有 fetch-mock 的模拟提取设置。单元测试失败,因为我模拟的预期响应没有返回。我尝试遵循 documentation用于全局获取模拟但没有成功,并且 typescript 使得很难遵循我找到的非 typescript 解决方案。如果可能的话,我想避免使用非全局沙箱,因为我必须重写大量代码来传递获取。
服务器.spec.ts
import * as fetchMock from 'fetch-mock';
import * as request from 'supertest';
import server from './server';
afterEach(() => {
server.close();
fetchMock.reset();
});
describe('router', () => {
test('GET: should return data', async () => {
const expectedResponse = { test: 'TEST' };
fetchMock.get('https://myapi.com/test', expectedResponse);
const response = await request(server).get('/test');
expect(response.status).toEqual(200);
expect(response.body).toMatchObject(expectedResponse);
});
});
server.ts
import * as Koa from 'koa';
import * as Router from 'koa-router';
import fetch from 'node-fetch';
const app = new Koa();
const router = new Router();
router.get('/test', async ctx => {
const options = { method: 'GET' };
try {
const response = await fetch('https://myapi.com/test', options);
ctx.body = await response.json();
} catch (error) {
error.fetchUrl = url;
throw error;
}
});
app.use(router.routes());
const server = app.listen(3000);
export default server;
最佳答案
您可以自己手动模拟node-fetch
模块。解决办法如下:
server.ts
:
import Koa from 'koa';
import Router from 'koa-router';
import fetch from 'node-fetch';
const app = new Koa();
const router = new Router();
router.get('/test', async ctx => {
const options = { method: 'GET' };
const url = 'https://myapi.com/test';
try {
const response = await fetch(url, options);
ctx.body = await response.json();
} catch (error) {
error.fetchUrl = url;
throw error;
}
});
app.use(router.routes());
function createHttpServer() {
return app.listen(3000);
}
if (require.main === module) {
createHttpServer();
}
export default createHttpServer;
server.spec.ts
:
import request from 'supertest';
import createHttpServer from './server';
import fetch from 'node-fetch';
const { Response } = jest.requireActual('node-fetch');
const server = createHttpServer();
jest.mock('node-fetch', () => jest.fn());
afterAll(done => {
server.close(done);
});
describe('router', () => {
test('GET: should return data', async () => {
const expectedResponse = { test: 'TEST' };
(fetch as jest.MockedFunction<typeof fetch>).mockResolvedValueOnce(new Response(JSON.stringify(expectedResponse)));
const response = await request(server).get('/test');
expect(response.status).toEqual(200);
expect(response.body).toEqual(expectedResponse);
});
test('GET: should throw error', async () => {
const mockedFetchError = new Error('some error');
(fetch as jest.MockedFunction<typeof fetch>).mockRejectedValueOnce(mockedFetchError);
const response = await request(server).get('/test');
expect(response.status).toEqual(500);
});
});
带有覆盖率报告的单元测试结果:
PASS src/stackoverflow/56735795/server.spec.ts (8.487s)
router
✓ GET: should return data (51ms)
✓ GET: should throw error (15ms)
console.error node_modules/koa/lib/application.js:200
undefined
console.error node_modules/koa/lib/application.js:201
Error: some error
at Object.<anonymous> (/Users/ldu020/workspace/github.com/mrdulin/jest-codelab/src/stackoverflow/56735795/server.spec.ts:26:30)
at step (/Users/ldu020/workspace/github.com/mrdulin/jest-codelab/src/stackoverflow/56735795/server.spec.ts:32:23)
at Object.next (/Users/ldu020/workspace/github.com/mrdulin/jest-codelab/src/stackoverflow/56735795/server.spec.ts:13:53)
at /Users/ldu020/workspace/github.com/mrdulin/jest-codelab/src/stackoverflow/56735795/server.spec.ts:7:71
at new Promise (<anonymous>)
at Object.<anonymous>.__awaiter (/Users/ldu020/workspace/github.com/mrdulin/jest-codelab/src/stackoverflow/56735795/server.spec.ts:3:12)
at Object.<anonymous> (/Users/ldu020/workspace/github.com/mrdulin/jest-codelab/src/stackoverflow/56735795/server.spec.ts:25:35)
at Object.asyncJestTest (/Users/ldu020/workspace/github.com/mrdulin/jest-codelab/node_modules/jest-jasmine2/build/jasmineAsyncInstall.js:102:37)
at resolve (/Users/ldu020/workspace/github.com/mrdulin/jest-codelab/node_modules/jest-jasmine2/build/queueRunner.js:43:12)
at new Promise (<anonymous>)
at mapper (/Users/ldu020/workspace/github.com/mrdulin/jest-codelab/node_modules/jest-jasmine2/build/queueRunner.js:26:19)
at promise.then (/Users/ldu020/workspace/github.com/mrdulin/jest-codelab/node_modules/jest-jasmine2/build/queueRunner.js:73:41)
at process._tickCallback (internal/process/next_tick.js:68:7)
console.error node_modules/koa/lib/application.js:202
undefined
-----------|----------|----------|----------|----------|-------------------|
File | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s |
-----------|----------|----------|----------|----------|-------------------|
All files | 95.24 | 50 | 100 | 94.12 | |
server.ts | 95.24 | 50 | 100 | 94.12 | 28 |
-----------|----------|----------|----------|----------|-------------------|
Test Suites: 1 passed, 1 total
Tests: 2 passed, 2 total
Snapshots: 0 total
Time: 10.36s
这是已完成的演示:https://github.com/mrdulin/jest-codelab/tree/master/src/stackoverflow/56735795
关于node.js - 如何使用 node-fetch、supertest 和 typescript 设置 fetch-mock,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56735795/
我正在使用 supertest 发送获取查询字符串参数,我该怎么做? 我试过 var imsServer = supertest.agent("https://example.com"); imsSe
我正在使用 expressjs 构建 API,我的路线如下所示 module.exports = function(app){ var book = require('../controllers/b
我是测试驱动开发的新手,正在尝试使用 super 测试来自学。我很困惑为什么我不断收到错误“应用程序未定义”?这是我对 request(app) 的调用,我在下面用粗体显示了它。我尝试查找文档,但似乎
初学者使用 Javascript 进行测试。我正在使用摩卡,但路易斯明智地表示,这个问题并不是摩卡特有的。我有一个 Node 应用程序,其中一些页面对匿名用户可见,而有些页面如果您未登录,则不应该看到
我正在尝试用 typescript 编写 API 测试。 我已经像这样安装了以下软件包: npm install -g mocha npm install chai npm install super
我有以下服务器类: import express, { Request, Response } from 'express'; export default class Server { serv
我正在使用 express 开发一个 API 并使用 supertest 对其进行测试.我的 API 端点正在返回 tar.gz 文件。我想测试一下文件是否正确发送并且内容是否正确。我在弄清楚如何检索
我是后端开发的新手,我遇到了一个我不明白的问题。 我设置了名为“health”的 API 的第一个路由,它只返回一条简单消息以了解我的服务器是否已启动。 这条路线看起来像预期的那样工作。 但是, 当我
我懂了 TypeError: Cannot read property 'status' of undefined 当尝试使用 supertest 将文件上传到简单的 Restify 服务器时,并且打
用supertest,我可以测试重定向代码302 var request = require('supertest'); var app = require('../server').app; des
我正在使用 supertest 测试我的 API 端点,而且效果很好,但我不知道如何测试文件下载是否成功。 在我的路由文件中,我将端点定义为: app.get('/api/attachment/:id
当我进行 API 调用时,我想检查返回的 JSON 的结果。我可以看到正文和一些静态数据正在被正确检查,但是在我使用正则表达式的任何地方,事情都被破坏了。这是我的测试示例: describe('get
我无法运行多个 Supertest/Mocha 测试,因为出现错误 Error: Trying to open unclosed connection. - 我发现了这个 post这建议循环并检查连接
我有一个使用 multer 并获取文件数组的 post 端点: router.post('/api/projects/:id/sessions', upload.array('files', 4),
我有一个经过 Mocha 测试的应用程序,并且能够使用我现在拥有的内容成功运行测试,但我在测试文件中显式设置了到 /api/v1 的 GET 路由。这是测试文件... API.js: var requ
我在 supertest、mocha 和 Node 方面遇到了一些问题,解析状态代码为 400。 这是我的 index.js 代码: var express = require('express');
我希望能够获取一些响应属性,并有时使用 SuperTest 将它们放入变量中。我怎样才能做到这一点?除了对响应的断言之外,我没有看到文档执行任何操作。 例如我想做这样的事情: var statusC
下面的数组(query.conditions)以某种方式转换为对象,知道为什么以及如何防止它吗? 请求: supertest(options.url) .g
我有一个看起来像这样的测试: it('should fail to get deleted customer', function(done) { request(app) .
我正在使用 supertest 测试我的 NodeJS 应用程序.我的应用程序正在请求证书,我的用户获得了针对该应用程序的授权证书的 CN。 在测试我的第一条路线时,我收到一个错误,提示我的自签名证书
我是一名优秀的程序员,十分优秀!