我有一个使用Passport进行身份验证的MEAN堆栈应用程序.
我正在尝试编写一个登录的单元测试,并检查是否重定向到root(/).但是,每当我运行Mocha时,我都会收到以下错误消息:
1) POST /home Login test should redirect to / after login:
Error: the string "Not a valid BCrypt hash." was thrown, throw an Error :)
Run Code Online (Sandbox Code Playgroud)
这是我的单元测试LoginSpec.js:
var should = require("should");
var app = require("../app");
var mongoose = require("mongoose");
var User = mongoose.model("User");
var request = require("supertest");
var agent = request.agent(app);
...
describe('POST /home', function() {
before(function(done) {
user = new User({
email: "john@email.com",
firstName: "John",
lastName: "Doe",
password: "strongPassword",
username: "johndoe"
});
user.save(done);
}) …Run Code Online (Sandbox Code Playgroud) 我正在使用jest&supertest测试我的api端点,测试正在通过,没有任何问题; 然而,我jest永远不会退出我通常会看到的X时间表中的Done.我希望确保--watch标志没有被使用,但事实并非如此.似乎与服务器的连接永远不会结束,所以jest不知道下一步是什么.UserFactory.generate()使用faker库创建虚假用户数据.
我在试图解决这个问题时感到很茫然.我已经按照推荐的策略在jest帮助页面上运行,没有运气,也在问题跟踪器中挖掘,但没有看到类似的问题.
这是我在运行测试套件时会看到的:
正如您所看到的那样,测试运行了7次.我被告知所有测试都已运行,然后morgan显示POST已发生的情况.jest永远不会退出,所以实际上这是失败的,因为它会在任何CI服务器超时,除非手动退出.
我尝试过使用.end() & done()以及.then() & done()代替async/await.他们都返回相同的最终结果,如果这是一个未解决的承诺的问题,jest将会因为未解决的承诺而出错,所以我无法理解为什么这不会像jest通常那样终止.
以前有人遇到过这样的问题吗?
user.controller.test.js
import mongoose from 'mongoose';
import request from 'supertest';
import { UserFactory } from '../../__mocks__';
import { User } from '../../modules';
import { config } from '../../utils';
import app from '../../'; …Run Code Online (Sandbox Code Playgroud) 我正在使用Passport.js进行身份验证(Facebook策略)并使用Mocha和Supertest进行测试.如何使用Supertest for Facebook策略创建会话并进行经过身份验证的请求?
以下是用户未登录时的示例测试:
describe 'when user not logged in', ->
describe 'POST /api/posts', ->
it 'respond with 401', (done)->
request(app).
post(API.url('posts')).
set('Accept', 'application/json').
send(post: data).
expect('Content-Type', /json/).
expect(401, done)
Run Code Online (Sandbox Code Playgroud)
谢谢你的建议:D
我正在使用supertest测试我的API
我想检查我的CSRF令牌保护是否有效,然后为其他测试禁用它.
为此我设置NODE_ENV为test或not_test
app.js
var csrf = require('csurf');
var app = express();
if (process.env.NODE_ENV !== 'test') {
app.use(csrf({ cookie: true }));
app.use(function(req, res, next) {
res.cookie('XSRF-TOKEN', req.csrfToken());
return next();
});
}
Run Code Online (Sandbox Code Playgroud)
测试CSRF
process.env.NODE_ENV = 'not_test';
var app = require("app.js");
var request = require('supertest')(app);
var testAccount = {
"login": "test",
"pass": "test"
};
describe('CSRF protection', function() {
it('On /login', function(done){
request
.post('/login')
.send(testAccount)
.expect(403, done);
});
});
Run Code Online (Sandbox Code Playgroud)
测试登录 NODE_ENV现在正在测试
process.env.NODE_ENV = 'test';
var …Run Code Online (Sandbox Code Playgroud) 这里我附加了我的代码,我传递完成回调并使用supertest请求.因为我在request.end块中的testcase中使用assert/expect,为什么我需要担心超时?我在这里犯的是什么错误.
it('should get battle results ', function(done) {
request(url)
.post('/compare?vf_id='+vf_id)
.set('access_token',access_token)
.send(battleInstance)
.end(function(err, res){ // why need timeout
if (err) return done(err);
console.log(JSON.stringify(res.body));
expect(res.body.status).to.deep.equal('SUCCESS');
done();
});
});
Run Code Online (Sandbox Code Playgroud)
响应后的测试用例结果:错误:超出2000ms的超时.确保在此测试中调用done()回调.
如果我使用mocha命令运行我的测试用例,那么它显示此错误,而如果我正在运行测试, mocha --timeout 15000 则testcase正确传递.但我想避免超时,我该怎么做?
我使用multer来处理我的 Express 应用程序中的文件上传,并且还使用node-sspi进行ntlm身份验证。
使用curl上传文件时,一切正常。但是当我尝试用超级测试做同样的事情时,它不起作用。
Supertest 确实只适用于身份验证或上传,但我还没有成功地同时使用它们。
工作卷曲命令:curl -u user:pass --ntlm -F upload=@filename http://localhost
超级测试代码不起作用:
request(app)
.post('/upload')
.auth(username, password)
.attach('upload', fileToUpload)
.expect(200)
Run Code Online (Sandbox Code Playgroud)
如果我省略attach或auth- 它可以工作(当然我需要在服务器端禁用身份验证,但一般来说我可以上传)
那么,有人知道如何使用超级测试上传带有身份验证的文件吗?
还作为问题发布在supertest 的 GitHub上
我今天想开始测试快速路线,但我可以弄清楚如何测试渲染翡翠视图。
这是我的代码:
路线:
router.get('/', function(req: any, res: any) {
res.render('index', { title: 'Express' });
});
Run Code Online (Sandbox Code Playgroud)
测试:
describe('GET / ', () => {
it('renders index', (done) => {
request(router)
.get('/')
.render('index', { title: 'Express' })
.expect(200, done);
});
});
Run Code Online (Sandbox Code Playgroud)
当然.render会导致错误。我应该如何测试渲染?
所以现在的输出是:
Warning: superagent request was sent twice, because both .end() and .then() were called. Never call .end() if you use promises
Warning: .end() was called twice. This is not supported in superagent
GET /api/things 200 3.009 ms - 2414
superagent: double callback bug
WARNING
Run Code Online (Sandbox Code Playgroud)
问题是,我需要res从调用中返回的对象.end()来测试 ETag 功能。它永远不会进入第二个.end(),也不会打印出该控制台日志。
最里面的.catch(done)是被调用的那个。
it('should return things', done => {
const promises = [];
promises.push(Thing.create(testThing));
promises.push(Thing.create(testThing));
Promise.all(promises)
.then(things => {
request(app)
.get('/api/things')
.expect(200)
.end((err, res) => {
const …Run Code Online (Sandbox Code Playgroud) 假设我有一些控制器逻辑:
// registered for route POST /login
function login(req, res, next) {
User.findOne({username: req.body.username}).exec()
.then(user => {
if (user) {
return bcrypt.compareAsync(req.body.password, user.password)
} else {
throw new APIError("Unauthorized", 401)
}
})
.then(some more chained promises)
.catch(next)
}
Run Code Online (Sandbox Code Playgroud)
但是当在控制器中测试悲伤路径时,它总是给出超时错误:
it('throws unauthorized error if no user match', () => {
return request(app)
.post('/login')
.send({ username: 'notExistInDB', password: 'asdfasd'})
.expect(401)
})
Run Code Online (Sandbox Code Playgroud)
此测试失败并显示错误消息:
Error: Timeout of 2000ms exceeded. For async tests …Run Code Online (Sandbox Code Playgroud) 我正在使用 express 开发一个 API 并使用supertest对其进行测试。我的 API 端点正在返回 tar.gz 文件。我想测试一下文件是否正确发送并且内容是否正确。我在弄清楚如何检索数据时遇到了麻烦。res.text我天真的方法是将(的内容保存const res = request(app).get('/project/export') 到文件中,将其提取并检查其内容。但是简单的保存res.text似乎不起作用,并且提取功能无法将其识别为正确压缩的文件。
任何帮助表示赞赏。请随意建议其他模块/方法来测试 Express 应用程序。谢谢!
supertest ×10
node.js ×8
express ×7
mocha.js ×6
passport.js ×2
superagent ×2
testing ×2
es6-promise ×1
javascript ×1
jestjs ×1
unit-testing ×1