我正在用 supertest 编写单元测试来测试我的服务器。但是我的一个包含一组 json 对象的 body 字段“到达”未定义。
编码:
//declaration of variable
tags = [{name: 'tag1'},{name: 'tag2'},{name: 'tag3'}];
//actual post
agent.post('/pictures')
.set('Connection', 'keep alive')
.set('Content-Type', 'application/x-www-form-urlencoded')
.field('picTitle', 'Picture Title')
.field('tags', tags)
.attach('file', __dirname + '/img/noel.jpg')
.end(function(pictureSaveErr, pictureSaveRes) {
//do stuff
}
Run Code Online (Sandbox Code Playgroud)
所以问题是服务器上的 req.body.tags 是未定义的。字符串没有问题。角度前端的实际实现运行良好,因此问题不在于服务器。
希望有人可以帮助我,在此先感谢...
这或多或少是supertest test express中间件的重复
但一年之后,我想我会开始一个新问题.
var express = require('express');
var request = require('supertest');
var app1 = express();
app1.get('/myapp', function (req, res) {
res.send(200, { name: 'myapp' });
});
request = request(app1);
it('should fail', function () {
request
.get('/hahahahahahahaha')
.expect(123);
});
Run Code Online (Sandbox Code Playgroud)
据我所知,这将永远错误地通过.路径错误并且期望不同的状态代码这一事实无关紧要.
并且 - 更一般地说(没有Express),它看起来总是通过,也:
it('should fail', function () {
request('http://thisdoesnotexist.mydomain')
.get()
.expect(200);
});
Run Code Online (Sandbox Code Playgroud)
这也不起作用:
it('should fail', function () {
request('http://thisdoesnotexist.mydomain')
.get()
.expect(200)
.end(function (err, res) {
if (err) {
throw err;
}
});
});
Run Code Online (Sandbox Code Playgroud)
有没有想过为什么会这样,或者如何实际测试这样的场景?
我对 Nodejs 很陌生,我正在 udemy 上学习 Nodejs 课程,listen EADDRINUSE: address already in use :::4000在多次重新运行集成测试时我遇到了一些麻烦。第一次成功,但后来我在以下行中收到上述错误
const server = app.listen(port, () => {winston.info(`Listening on port ${port}`)});\nRun Code Online (Sandbox Code Playgroud)\n\n我正在粘贴我的index.js和两个测试文件,如果有人能指出我,这对我来说将是一个很大的帮助。
\n\n索引.js
\n\n const Joi = require("@hapi/joi");\n Joi.objectId = require("joi-objectid")(Joi);\n const winston = require("winston");\n const express = require("express");\n const app = express();\n\n require("./startup/logging")();\n require("./startup/config")();\n require("./startup/dbconnectivity")();\n require("./startup/routes")(app);\n const port = process.env.port || 4000;\n const server = app.listen(port, () => {winston.info(`Listening on port ${port}`)});\n // exporting server object to be used in integration tests.\n …Run Code Online (Sandbox Code Playgroud) 如果出现我确定 catch 会处理的错误,我如何在 Jest 中测试我的 try / catch 块?例如,我想测试此代码以从单独的文件中读取令牌。我想测试我的捕获,但问题是我不知道如何在 Jest 中创建一个情况来在 Jest 中处理错误。
const readToken = async () => {
try{
const readFile = await fs.readFile('./apiData.json');
const data = JSON.parse(readFile);
return data.token;
}catch(err){
throw err;
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的 Jest 代码,但我认为工作不正确,因为在覆盖范围内显示带有 catch(err) 的行未被发现。
it('should return catch error',async (done) => {
try{
await readToken()
done()
}catch(e){
done(e);
}
})
Run Code Online (Sandbox Code Playgroud) 我有一个包含两条路线的文件。
路线/ index.js
const express = require('express')
const router = express.Router()
router.get('', (req, res, next) => {
try {
res.status(200).render('../views/')
} catch (error) {
next(error)
}
})
router.get('*', (req, res, next) => {
try {
res.status(404).render('../views/not-found')
} catch (error) {
next(error)
}
})
module.exports = router
Run Code Online (Sandbox Code Playgroud)
我想测试 catch 分支。一个明显的问题是我不能伪造 router.get 的回调做了什么,因为那样我的测试将毫无意义,我会修改我想要测试的东西。
我可以向这些特定路由发送 Supertest 请求,但随后我无法控制会发生什么。我想避免创建硬编码路由,只是为了检查下一个函数是否调用了中间件。如果我理解正确,如果我会在 try 块中发生其他事情(如数据库查询),那么我可以模拟它以引发错误。
但我没有在那里发生任何额外的事情。这是我无法理解的:如果我模拟服务器所做的事情,那么我不会测试我已经拥有的东西,而是其他东西,所以这样做没有意义。也许我误解了事情是如何工作的,但据我所知,唯一的选择是以某种方式模拟 res.status 或 res.render 的作用(存根它们以便它们抛出错误),所以以某种方式模拟 Supertest 的作用,但我不知道该怎么做。
任何帮助将不胜感激!
我有一个提供 API 的 KoaJS 应用程序,我正在使用 mocha/supertest 来测试 API。其中一项测试是确保您可以通过 API 创建 oauth 令牌。测试看起来像这样:
it('should be able to create a token for the current user by basic authentication', function(done) {
request
.post('/v1/authorizations')
.auth('active.user', 'password')
.expect(200)
.expect({
status: 'success',
responseCode: 200,
data: {
data: [{
id: 1,
type: "access",
token: "A2345678901234567890123456789012",
userId: 1,
note: null,
oauthApplicationId: 1,
createdTimestamp: "2014-04-17T23:17:06.000Z",
updatedTimestamp: null,
expiredTimestamp: null
}]
}
}, done);
});
Run Code Online (Sandbox Code Playgroud)
这里的问题是 token 和 createdTimestamp 是我在执行测试之前无法确定的值。
在不模拟响应的情况下测试这种情况的最佳方法是什么(因为我希望这个测试实际命中数据库并且需要这样做)?