【问题标题】:Tests passing with assertion fails in WebStorm在 WebStorm 中通过断言的测试失败
【发布时间】:2020-08-06 17:54:26
【问题描述】:

我正在尝试使用 mocha/chai/supertest 运行基本测试。当我使用命令行时,我得到了测试失败的信息,但在 WebStorm 我得到了这个

这是测试代码

const chai = require('chai');
const chaiHttp = require('chai-http');
const request = require('supertest');
const app = require('../app');

const { expect, } = chai;

chai.use(chaiHttp);

const generateUser = (email, password, passwordRepeat) => ({ email, password, passwordRepeat, });

describe('Users', () => {
  describe('POST /users/register', () => {
    it('should get an error saying "Password is invalid"', () => {
      request(app)
        .post('/users/register')
        .send(generateUser('test@test.tes', 'invalid', 'invalid'))
        .expect(200)
        .end((err, res) => {
          expect(JSON.stringify(res.body)).to.equal(JSON.stringify({
            errors: [
              'Password is invalid',
            ],
            ok: false,
          }));
        });
    });
    it('should get an error saying "Passwords do not match"', () => {
      request(app)
        .post('/users/register')
        .send(generateUser('test@test.tes', 'zaq1@WSX', 'invalid2'))
        .end((err, res) => {
          expect(JSON.stringify(res.body)).to.equal(JSON.stringify({
            errors: [
              'Passwords do not match',
            ],
            ok: true,
          }));
        });
    });
    it('should get an error saying "Email is invalid"', () => {
      request(app)
        .post('/users/register')
        .send(generateUser('test@test.tessada', 'zaq1@WSX', 'zaq1@WSX'))
        .expect(200)
        .end((err, res) => {
          expect(JSON.stringify(res.body)).to.equal(JSON.stringify({
            errors: [
              'Email is invalid',
            ],
            ok: false,
          }));
        });
    });
  });
});

有趣的是,这只发生在我在描述块上运行测试时。因此一次进行多个测试。如果我只运行一项测试,我会得到错误。我该如何解决?

【问题讨论】:

    标签: javascript unit-testing mocha.js webstorm chai


    【解决方案1】:

    这是一个异步测试,您应该使用Mocha 提供的done 回调。否则,您的 it() 测试会在请求断言运行之前成功完成,这意味着无需测试任何内容。

    Supertest suggests 像这样使用它:

       // add done parameter below
       it('should get an error saying "Password is invalid"', (done) => {
          request(app)
            .post('/users/register')
            .send(generateUser('test@test.tes', 'invalid', 'invalid'))
            .expect(200)
            .end((err, res) => {
              expect(JSON.stringify(res.body)).to.equal(JSON.stringify({
                errors: [
                  'Password is invalid',
                ],
                ok: false,
              }));
    
              // call done() when test/assertions finished
              done();
            });
        });
    

    当然,您应该为所有异步测试执行此操作。

    【讨论】:

    • 这行得通。奇怪的是它可以在没有完成的情况下在 cli 中工作,但在 webstorm 中却不行。
    • 是的,这很奇怪。你可以感谢 Webstorm 否则你不知道测试没有测试任何东西。这也发生在我最近。测试助手中的一个小 return 错误,有些测试总是这样通过......
    猜你喜欢
    • 2018-02-24
    • 2021-12-31
    • 1970-01-01
    • 2020-12-31
    • 2019-04-11
    • 2020-01-29
    • 1970-01-01
    • 1970-01-01
    • 2017-04-05
    相关资源
    最近更新 更多