我正在使用MochaJS和SuperTest在开发过程中测试我的API并且非常喜欢它。
但是,在将代码推送到生产环境之前,我还希望将这些相同的测试用于远程测试我的临时服务器。
以下是我使用的测试样本
request(app)
.get('/api/photo/' + photo._id)
.set(apiKeyName, apiKey)
.end(function(err, res) {
if (err) throw err;
if (res.body._id !== photo._id) throw Error('No _id found');
done();
});
答案 0 :(得分:15)
我不确定你是否能用supertest做到这一点。你绝对可以用superagent来做。 Supertest建立在superagent之上。一个例子是:
var request = require('superagent');
var should = require('should');
var agent = request.agent();
var host = 'http://www.yourdomain.com'
describe('GET /', function() {
it('should render the index page', function(done) {
agent
.get(host + '/')
.end(function(err, res) {
should.not.exist(err);
res.should.have.status(200);
done();
})
})
})
因此您无法直接使用现有测试。但他们非常相似。如果你添加
var app = require('../app.js');
通过更改host
变量,您可以轻松地在测试本地应用和远程服务器上的部署之间切换到测试的顶部
var host = 'http://localhost:3000';
编辑:
刚刚在docs#example
中找到了supertest的示例request = request.bind(request, 'http://localhost:5555'); // add your url here
request.get('/').expect(200, function(err){
console.log(err);
});
request.get('/').expect('heya', function(err){
console.log(err);
});
答案 1 :(得分:2)
其他答案对我不起作用。
他们使用 .end(function(err, res) {
这对于任何异步 http 调用都是一个问题,需要使用 .then
代替:
示例工作代码如下:
<块引用>文件:\test\rest.test.js
let request = require("supertest");
var assert = require("assert");
describe("Run tests", () => {
request = request("http://localhost:3001"); // line must be here, change URL to yours
it("get", async () => {
request
.get("/") // update path to yours
.expect(200)
.then((response) => { // must be .then, not .end
assert(response.body.data !== undefined);
})
.catch((err) => {
assert(err === undefined);
});
});
});
<块引用>
文件:\package.json
"devDependencies": {
"supertest": "^6.1.3",
"mocha": "^8.3.0",
},
"scripts": {
"test": "mocha"
}
<块引用>
安装并运行
npm i
npm test
答案 2 :(得分:0)
您已经提到了它,因为您定位的是远程URL,只需将应用替换为远程服务器URL
request('http://yourserverhere.com')
.get('/api/photo/' + photo._id)
.set(apiKeyName, apiKey)
.end(function(err, res) {
if (err) throw err;
if (res.body._id !== photo._id) throw Error('No _id found');
done();
});