node.js - 在多个文件中使用 supertest 进行 Nodejs API 测试的正确方法?
问题描述
我已经编写了几个 API,我想使用 supertest 编写测试用例。我有两个文件,index.js 和 tester.js。
index.js
import tester from './tester';
const supertest = require('supertest');
const randomString = require('randomstring');
const app = require('../../dist/server');
const request = supertest(app);
describe('User signup and login', () => {
tester(request);
it('Signup -> New user signup test', (done) => {
request.post('/users')
.send(`userName=test${randomString.generate(7)}&password=12345678&firstName=name&lastName=name`)
.set('Accept', 'application/json')
.expect('Content-Type', /json/)
.expect(201)
.end((err, res) => {
if (err) {
return done(err);
}
return done();
});
});
});
tester.js
const randomString = require('randomstring');
export default function tester(request) {
describe('testter ', () => {
it('Signup -> New user signup test', (done) => {
request.post('/users')
.send(`userName=test${randomString.generate(7)}&password=12345678&firstName=nigilan&lastName=palladium`)
.set('Accept', 'application/json')
.expect('Content-Type', /json/)
.expect(201)
.end((err, res) => {
if (err) {
return done(err);
}
return done();
});
});
});
}
现在,当我运行 index.js 文件时,它会同时运行两个测试用例。这是正确的方法吗?
解决方案
在函数中嵌入测试
我不明白 的目的tester.js
。这是一个有点奇怪的设置。但是您确实编写了两次相同的测试,并且通过在块内调用tester
函数describe
,您实际上是将测试放在该块内。我建议不要将测试块包装在此类函数中,除非您有迫切的理由这样做。
超测的使用
我认为 supertest 的目的是在每个测试中初始化,也就是说,而不是写
const request = supertest(app);
describe('User signup and login', () => {
it('Signup -> New user signup test', (done) => {
request.post('/users')
写这个:
describe('User signup and login', () => {
it('Signup -> New user signup test', (done) => {
const request = supertest(app);
request.post('/users')
如果您需要使用实际代理验证某些 cookie 功能,这将变得至关重要。在这种情况下,代理在其内部状态中携带 cookie,您当然不希望在测试之间共享该状态。
将测试标记为已完成
Mocha 的 done 函数可以直接传递给expect
,所以不用写:
.expect(201)
.end((err, res) => {
if (err) {
return done(err);
}
return done();
});
你可以写
.expect(201, done);
或者supertest也可以作为promise使用,mocha支持promise,所以可以这样写
it("signup ...", () => {
return request.post('/users')
...
.expect(201);
});
所以这意味着 的返回值expect
有一个then
函数。该函数是否被实际调用将决定它是作为一个承诺,还是在“传统”模式下。如果你在 mocha 测试中返回了 Promise,mocha 会调用then
,并且使用 Promise 行为。
推荐阅读
- python - 取决于图像的图像上传和 OCR 响应的 Python 不同错误
- powershell - 在 cmdlet set-transportrule 中添加数组值
- php - 带有 PHP curl 的 Spotify oauth2。如何获取授权码?
- tableau-api - Tableau - 过滤器无法正常工作
- django - Wagtail 在 base.html 中的静态路径之前添加子页面目录
- javascript - React - 如何导入挂钩值
- html - 如何在使用外部 div 悬停状态时更改内部 div 内的文本颜色
- javascript - 我想将此数据 {{quote}} 发送到 app.js 端
- angular9 - 从 Angular 中的子表单中识别控件的值更改
- node.js - 如何使用两次传入ejs的数据