我遇到了一个问题,在使用chai-http运行后我的mocha测试没有完成.测试后Mocha会挂起并最终进入超时状态(至少在我的CI上).
我正在尝试使用 chai/chai-http 为我的节点代码编写单元测试。一切正常,直到我将服务器切换到 HTTPS 服务器,但由于我的证书是由内部公司根签名的,并且我使用的证书的通用名称与 localhost 不匹配,因此 chai 在我的请求中抛出错误.
我想做以下事情:
忽略与域名验证相关的 SSL 错误。
设置要检查的 CA 列表。如果这不能完成,我可以跳过所有客户端证书检查。
我的代码如下:
var chai = require('chai');
var chaiHttp = require('chai-http');
var https = require('https');
var fs = require('fs');
var server = require('../app.js');
chai.should();
chai.use(chaiHttp);
https.globalAgent.options.ca = [
fs.readFileSync('./ssl/Root.cer'),
];
describe('Attachments', function () {
it('should succeed when passed valid arguments', function (done) {
chai.request(server)
.get('/10881057300D0A4E8E8586542AA3626E41')
.set('userId', 'user')
.set('region', 'US')
.end(function (err, res) {
chai.assert(res);
res.should.have.status(200);
chai.assert(res.body);
done();
});
});
it('should return error without userId header', function …Run Code Online (Sandbox Code Playgroud) 我正在寻找一种正确的方法来在测试之间完全重置我的快递服务器!似乎这不仅仅是我的问题,许多其他用户也提出了同样的问题,并且已经写了很多关于争论的博文。提出的解决方案对我来说既不奏效也不令人满意。这里有另一个类似的问题和一篇文章,很好地描述了问题并提出了一些解决方案:
博客:https : //glebbahmutov.com/blog/how-to-correctly-unit-test-express-server/
这里专门创建了一个包来解决这个问题:https : //www.npmjs.com/package/server-destroy
现在,一个最小的工作示例来重现我的情况。在被测代码中,创建了一个 express 服务器;当在某个端点上调用时,服务器增加一个值并返回它:
( function() {
'use strict'
const enableDestroy = require( 'server-destroy' )
const app = require( 'express' )()
const http = require( 'http' )
let val = 0
app.use( '/inc', (req, res) => {
val ++
res.send(val.toString())
} )
const server = http.createServer( app )
server.listen( 3000 )
enableDestroy(server);
module.exports = server
} )()
Run Code Online (Sandbox Code Playgroud)
测试包含两个相同的测试用例;他们都在端点上调用服务器,并检查返回值。
before_each和after_each部分是为了确保在运行单个测试用例之前创建新连接,然后关闭,以确保两个测试用例之间的独立性:
const chai = require( 'chai' ) …Run Code Online (Sandbox Code Playgroud) 我正在测试我的GraphQL API,但我想稍微清理一下.值得注意的是我正在使用chai-http网络请求.这是我目前正在做的事情(哪个有效):
let createUser = (()=> {
return new Promise((resolve, reject) => {
chai.request(server)
.post('/api/graphql/')
.set('content-type', 'application/json')
.send({ 'query' :
'mutation users { \
user : addUser(inputs: { \
firstName: \"Test\", \
lastName: \"User\", \
email: \"test@test.com\", \
}) { \
id, \
firstName \
} \
}'
})
.end((err, res) => {
if (err) { reject(err) }
let data = res.body.data;
let user = data.user;
resolve(user);
})
});
});
Run Code Online (Sandbox Code Playgroud)
但是,我想稍微清理它并执行以下操作:
let createUser = (() => {
let …Run Code Online (Sandbox Code Playgroud) 如何使用 chai-http 使用如下所示的客户端证书执行获取请求?
curl -k --key [key_path] --cert [cert-path]:secret 'https://127.0.0.1/url'
Run Code Online (Sandbox Code Playgroud)
以下代码返回错误:
错误:错误:0906A068:PEM 例程:PEM_do_header:密码读取错误
我想这是因为缺少密码参数。
let chai = require('chai');
let chaiHttp = require('chai-http');
let should = chai.should();
var expect = chai.expect;
chai.use(chaiHttp);
// load certificates
let fs = require('fs')
let key = fs.readFileSync(__dirname + '/user.key')
let cert = fs.readFileSync(__dirname + '/user.crt')
describe('client certificate call', () => {
it('should return data', () => {
chai.request('https://127.0.0.1')
.get('/url')
.key(key)
.cert(cert, 'secret')
// .passphrase('secret')
.end((err, res) => {
res.should.have.status(200);
done();
});
});
})
Run Code Online (Sandbox Code Playgroud)
使用 axios …
我正在尝试使用 Sinon 在快速路由中删除一些自定义中间件,但它没有按我预期的那样工作。我希望它不会记录“我正在验证...”,而是将“存根”记录到控制台。看起来 sinon 没有正确地剔除中间件。
测试/test.js
const chai = require('chai');
const chaiHttp = require('chai-http');
const sinon = require('sinon');
chai.use(chaiHttp);
const should = chai.should();
const auth = require('../auth');
const app = require('../app')
describe('My routes', function() {
let checkTokenStub;
beforeEach(()=>{
checkTokenStub = sinon.stub(auth,'checkToken').callsFake(()=>{
console.log('Stubbed');
});;
})
it('returns hello', function(done) {
chai.request(app)
.get('/')
.set('X-Auth-Token', 'xyz123')
.end((err,res)=>{
res.text.should.be.eql('Hello')
done(err)
})
});
});
Run Code Online (Sandbox Code Playgroud)
应用程序.js
var express = require('express'),
app = express();
var router = express.Router();
app.use('/', require('./router'));
module.exports = app;
Run Code Online (Sandbox Code Playgroud)
认证.js
exports.checkToken = function(req, res, …Run Code Online (Sandbox Code Playgroud) 我正在使用 mocha、chai 和 chai-http 为我的 Node.js 和 Express 应用程序进行集成测试。我正在尝试测试我的登录路由是否有令牌。我尝试了不同的断言来检查数据对象内部是否存在令牌,但它们都不起作用。
来自 Postman 的数据如下所示:
{
"data": {
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6NiwiaWF0IjoxNTYzODczMzE3LCJleHAiOjE1NjM5NTk3MTd9.bM1RFem2pnlEqjTWGhg-s4Am1PjGNRUS_8x5Dq8J6lI",
"user": {
"id": 6,
"firstName": "John",
"lastName": "Doe",
"email": "test@test.com",
"createdAt": "2019-07-23T06:38:11.358Z",
"updatedAt": "2019-07-23T06:38:11.358Z"
}
},
"hasErrors": false,
"errors": []
}
Run Code Online (Sandbox Code Playgroud)
这是我的实际测试,我试图检查 res.body 是否在数据对象内嵌套了令牌。
/* Login Test */
let credentials = {
'email': 'adnan@test.com',
'password': 'test'
};
describe("POST /user-sessions", function() {
it("should login user", function(done) {
chai.request('http://localhost:3000')
.post("/user-sessions")
.send(credentials)
.end((err, res) => {
res.should.have.status(200);
res.body.should.have.nested.property('data.token');
done();
})
});
})
Run Code Online (Sandbox Code Playgroud)
我收到 Uncaught AssertionError: Expected …
无论我的服务器实际返回什么,Chai 总是会告诉我res.body={}内容类型是否为“application/javascript”。
这是我的服务器:
const http = require('http');
const server = http.createServer(function (request, response) {
response.writeHead(200, {"Content-Type": "application/javascript"});
response.end('console.log("test");');
});
module.exports = server;
server.listen(process.env.PORT || 8000);
console.log("Server running at http://localhost:8000/");
Run Code Online (Sandbox Code Playgroud)
但测试没有看到它:
const chai = require('chai');
const chaiHttp = require('chai-http');
const server = require('./test-server');
const should = chai.should();
chai.use(chaiHttp);
describe('GET /test', () => {
it('it should give test result', (done) => {
chai.request(server)
.get('/test')
.end((err, res) => {
console.log(err);
console.log(res);
console.log(res.body); // {}
console.log(res.text); // undefined
res.body.should.be.eql('console.log("test");'); …Run Code Online (Sandbox Code Playgroud) 我使用chai-http对我的REST api进行了正常的单元测试.它失败并出现以下错误
warn: double callback!
error: { SyntaxError: Unexpected token { in JSON at position 58
at Object.parse (native)
at IncomingMessage.<anonymous> (E:\projects\node_modules\chai-http\node_modules\superagent\lib\node\parsers\json.js:8:35)
at emitNone (events.js:91:20)
at IncomingMessage.emit (events.js:185:7)
at endReadableNT (_stream_readable.js:974:12)
at _combinedTickCallback (internal/process/next_tick.js:80:11)
at process._tickCallback (internal/process/next_tick.js:104:9)
rawResponse: '{"books":[],"count":0,"page":1,"pages":0,"pageSize":10}{"books":[],"count":0,"page":1,"pages":0,"pageSize":10}',
statusCode: 200,
response: undefined }
Run Code Online (Sandbox Code Playgroud)
如您所见,rawResponse由于测试失败,重复.我调试了代码,控制器代码只调用一次,输出正确.但无法理解为什么会出现这种错误.
以下是测试代码
// some code to mock mongoose with mockgoose
....
....
let server = require('../../../server');
let should = chai.should();
chai.use(chaiHttp);
describe.only('Books', () => {
describe('/GET book', () => {
it('it should GET all …Run Code Online (Sandbox Code Playgroud) 我正在创建 API 测试,它检查响应是否包含结构中的特定键“textId”:
it('TC-4 /rest/passwords/ should change "password"', function() {
return chai.request(serverurl)
.post('/rest/passwords/')
.set('Content-Type', 'application/json')
.set('Accept', 'text/html')
.set('X-Api-Key', global.apikey)
.set('Cookie', global.cookie)
.send({password: "password"})
.then(function(res) {
res.should.have.status(200);
res.should.be.json;
console.log('TC-4 /rest/passwords/: %j\n', res.body);
res.body.should.have.all.keys(['textId']);
});
});
Run Code Online (Sandbox Code Playgroud)
回应如下:
[{"textId":"PasswordNeedsAtLeastOneDigit","parameters":{}},{"textId":"PasswordNeedsAtLeastOneUpperCaseCharacter","parameters":{}}]
Run Code Online (Sandbox Code Playgroud)
我试过:
res.body.should.have.property('textId');
res.body.should.have.nested.property('textId');
res.body.should.have.all.keys(['textId']);
res.body.should.have.all.nested.keys(['textId']);
Run Code Online (Sandbox Code Playgroud)
他们都没有工作