我在尝试使用 SuperTest 测试一些 Express Routes 时遇到了一些困难。
// Mocha test
..
request(app)
.get('/user')
.expect(200)
.end(function(err, res){
if (err) return done(err);
done()
});
...
// Router
app.get('/user', function(req, res){
res.render('user.jade');
});
Run Code Online (Sandbox Code Playgroud)
当我使用浏览器手动测试路由器时,路由器工作正常,并呈现 jade 模板视图,但是当我运行 mocha 测试时,它失败并显示“未捕获的预期假为真”。Express 将请求记录为成功 (200),但测试仍显示为失败并显示错误消息。
我曾尝试对 SuperTest 段使用不同的代码习语、不同的 jade 模板,而且似乎只在我第一次在呈现模板的路由器上运行测试时发生。即使在相同的路由器和模板上使用 GET 进行以下测试也成功???
已尝试使用路由器查找代码示例,但未成功呈现视图,所以这可能是不受支持的情况?
我只是在做一些 API 测试,并且试图验证发送下来的 cookie 数据是否正确,但是我找不到任何有关从响应对象获取 cookie 的文档,只能从请求中获取 cookie。
那么有没有一种快速的方法可以像处理请求一样执行此操作req.cookies["myCookie"],我知道我可以获取标头并从那里获取 set-cookie,但尝试从那里手动解析 cookie 数据有点混乱。
我试图存根一个风帆控制器函数,但我不知道存根哪个对象。使用
sinon.stub(object,'funcname', function()...
这可能与sails绑定控制器功能的方式有关......
这是一些示例代码
控制器文件 api/controllers/PersonController.js
var fs = require('fs');
//
// I want to stub retrieveData function when testing
//
function retreiveData(cb) {
fs.readFile('./filedata', function (err, data) {
if (err) throw err;
cb(data.toString());
});
};
function showdata(req, res) {
var stack = new Error().stack
console.log( stack )
retreiveData(function (data) {
res.send(data);
});
};
module.exports = {
showdata: showdata,
retreiveData: retreiveData
};
Run Code Online (Sandbox Code Playgroud)
测试文件:
var request = require('supertest');
var sinon = require('sinon');
describe('GET /person/showdata', function() {
it('should return …Run Code Online (Sandbox Code Playgroud) 这个中间件在 Supertest 中运行时没有出现:
app.use((err, req, res, next) => {
// WHY DOES Supertest NOT SHOW THIS ERROR??
console.log("error: ", err.message);
res.status(422).send({ error: err.message });
});
Run Code Online (Sandbox Code Playgroud)
我只是花了一些愚蠢的时间试图找到这个错误:
Driver.findByIdAndDelete(driverId) // Remove NOT Delete
.then(driver => {
res.status(204).send(driver)
})
...
Run Code Online (Sandbox Code Playgroud)
在使用 Postman 时,中间件正确地将错误显示为对正文的响应,但在运行测试时却没有。
我打开了 2 个终端窗口,运行 npm run:test并且start在运行 Postman 之前,这里没有任何帮助。
包.json:
"dependencies": {
"body-parser": "^1.17.1",
"express": "^4.15.2",
"mocha": "^3.2.0",
"mongoose": "^4.8.6"
},
"devDependencies": {
"nodemon": "^1.11.0",
"supertest": "^3.0.0"
}
Run Code Online (Sandbox Code Playgroud) 我是 NodeJs 初学者。无论如何,我想创建一个从测试开始的应用程序,比如 TDD 方法。
Mocha 和 Supertest 有什么区别?
我有带有 mongo 连接的 koa 服务器,并使用 supertest 来模拟服务器并发送请求,开玩笑作为测试框架。
const app = new Koa()
...
export default app.listen(PORT, (err) => {
if (err) console.log(err)
if (!IS_TEST) {
console.log(`Server running on port: ${PORT}`)
}
})
Run Code Online (Sandbox Code Playgroud)
成功完成测试或失败服务器连接钢工作后,测试后如何关闭koa服务器连接?
测试示例:
import supertest from 'supertest'
import mongoose from 'mongoose'
import server from '../../../app/server'
import User from '../../../app/models/user'
const r = supertest.agent(server.listen())
afterEach(async (done) => {
await mongoose.connection.db.dropDatabase()
done()
})
describe('Authorization', () => {
describe('POST /signup', () => {
const userData = {
email: 'test@test.com',
password: 111111,
} …Run Code Online (Sandbox Code Playgroud) 我在使用 Express 的“cookieSession”使用 Supertest 测试 Express 应用程序时遇到问题。当我session从 Express使用时,一切正常,但cookieSession不能正确使用 PassportJS。
我正在使用 PassportJS 对用户进行身份验证并将用户设置为请求对象 (req.user)。所以/login按预期工作,它返回正确的set-cookie标头,但在下一个请求中,身份验证失败req.user,即使它正确反序列化/序列化用户,也不会使用用户对象设置属性
版本:
这就是我初始化超级代理的方式:
import * as supertest from 'supertest';
import * as superagent from 'superagent';
import app from '../../app';
const request = supertest.agent(app);
Run Code Online (Sandbox Code Playgroud)
我在测试之前运行登录(使用异步/等待功能):
await request.post('/login').send({
email: 'some@email.com',
password: 'plainpassword'
});
Run Code Online (Sandbox Code Playgroud)
然后我向后端发出第一个请求以检索数据:
const readResponse: superagent.Response = await
request.post('/getData').send(requestBody);
Run Code Online (Sandbox Code Playgroud)
这就是它失败的地方。它返回状态代码 401,因为 PassportJS 不提供用户数据来请求对象。也许它不在 req.user 中?
在 app.ts 中,我像这样设置了 cookieSession 和passportJS 会话:
app.use(cookieSession({
keys: [process.env.SESSION_SECRET], …Run Code Online (Sandbox Code Playgroud) 我有一个用于测试的 jest supertest 设置,我试图在测试完成后关闭服务器,但它抛出错误,它说 server.close() 不是一个函数。这里有什么问题?是 express 还是 jest 还是 supertest 的问题我无法弄清楚我是测试新手,请帮助我。server.js 文件:
const next = require('next');
const express = require('express');
const winston = require("winston");
const config = require("config");
const passport = require('passport');
const flash = require('connect-flash');
const path = require('path');
var cookieSession = require('cookie-session');
const cookieParser = require('cookie-parser');
var app = express();
const dev = process.env.NODE_ENV !== 'production';
const nextApp = next({dev});
const port = process.env.PORT || config.get("port");
const handleRequest = nextApp.getRequestHandler();
nextApp.prepare().then(() => {
require("./server/startup/cors")(app);
require("./server/startup/db")();
app.use(cookieParser('ilovescotchscotchyscotchscotch'));
app.use(express.json()); …Run Code Online (Sandbox Code Playgroud) 我有一个简单的快速 http 服务器,它在向 / 发出 get 时返回“Hello worl”
我有以下测试:
import request from 'supertest';
import app from '../app/app';
test('test http server', async () => {
const res = await request(app).get('/')
expect(res.body).toEqual('Hello world');
});
Run Code Online (Sandbox Code Playgroud)
测试失败是这样的:
? test http server
expect(received).toEqual(expected)
Expected: "Hello world"
Received: {}
7 | const res = await request(app).get('/')
8 |
> 9 | expect(res.body).toEqual('Hello world');
Run Code Online (Sandbox Code Playgroud)
如何将 response.body 作为文本获取以进行检查?
我正在使用 Supertest 和 Jest 来测试 Node.js API。
示例测试具有以下格式
it('Read a note for a user', (done) => {
request(graphqlURL)
.post('/graphql')
.set(baseHeaders())
.send({
query: graphQLQuery
})
.end((err, res) => {
expect(res.status).toBe(200);
done();
})
});
Run Code Online (Sandbox Code Playgroud)
当前,当期望失败时,会记录以下内容
expect(received).toBe(expected) // Object.is equality
Expected: 200
Received: 404
Run Code Online (Sandbox Code Playgroud)
我还想在失败的测试旁边记录请求和响应,以便在调试时获得更多上下文。
有没有办法打印那些,仅用于失败的测试?