标签: supertest

获取"错误:字符串"不是有效的BCrypt哈希."在Mocha ExpressJS测试期间抛出了一个错误:)"

我有一个使用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)

mocha.js node.js express supertest passport.js

7
推荐指数
1
解决办法
6644
查看次数

测试成功完成后,Jest不会终止

我正在使用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)

supertest jestjs

7
推荐指数
1
解决办法
5325
查看次数

如何使用Passport/Facebook策略验证Supertest请求/?

我正在使用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

mocha.js node.js express supertest passport.js

6
推荐指数
1
解决办法
7433
查看次数

不同的NODE_ENV用于不同的测试

我正在使用supertest测试我的API

我想检查我的CSRF令牌保护是否有效,然后为其他测试禁用它.

为此我设置NODE_ENVtestnot_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)

mocha.js node.js superagent supertest

6
推荐指数
1
解决办法
1593
查看次数

如何避免摩卡测试用例超时?

这里我附加了我的代码,我传递完成回调并使用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正确传递.但我想避免超时,我该怎么做?

unit-testing mocha.js node.js supertest

6
推荐指数
2
解决办法
5134
查看次数

无法通过身份验证将文件从超级测试上传到 multer

我使用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)

如果我省略attachauth- 它可以工作(当然我需要在服务器端禁用身份验证,但一般来说我可以上传)

那么,有人知道如何使用超级测试上传带有身份验证的文件吗?

还作为问题发布在supertest 的 GitHub上

node.js express supertest

6
推荐指数
1
解决办法
1471
查看次数

如何使用 supertest 和 mocha 测试快速渲染

我今天想开始测试快速路线,但我可以弄清楚如何测试渲染翡翠视图。

这是我的代码:

路线:

  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会导致错误。我应该如何测试渲染?

mocha.js node.js express supertest

6
推荐指数
1
解决办法
2676
查看次数

当一个超级测试请求依赖于另一个请求时,如何链接超级测试请求?

所以现在的输出是:

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)

testing node.js express supertest

6
推荐指数
2
解决办法
1万
查看次数

对于 Promise 中抛出的错误,Express Supertest 总是给出超时错误

假设我有一些控制器逻辑:

// 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)
  1. 该路线在开发服务器中运行良好。
  2. 我已经实现了错误处理中间件。401 错误可以正确传播到中间件并给出 401 响应。
  3. 我使用Mocha + Supertest(当我需要存根一些方法时使用Sinon + SinonTest)进行测试。
  4. 快乐之路的考验可以通过。
  5. 在测试中正确检测到控制器之前的其他中间件(例如快速验证)生成的悲伤路径的测试。

但是当在控制器中测试悲伤路径时,它总是给出超时错误:

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)

mocha.js node.js express supertest es6-promise

6
推荐指数
0
解决办法
666
查看次数

使用 supertest 测试二进制响应

我正在使用 express 开发一个 API 并使用supertest对其进行测试。我的 API 端点正在返回 tar.gz 文件。我想测试一下文件是否正确发送并且内容是否正确。我在弄清楚如何检索数据时遇到了麻烦。res.text我天真的方法是将(的内容保存const res = request(app).get('/project/export') 到文件中,将其提取并检查其内容。但是简单的保存res.text似乎不起作用,并且提取功能无法将其识别为正确压缩的文件。

任何帮助表示赞赏。请随意建议其他模块/方法来测试 Express 应用程序。谢谢!

javascript testing express superagent supertest

6
推荐指数
1
解决办法
1764
查看次数