代码之家  ›  专栏  ›  技术社区  ›  Langlois.dev

Chai测试TypeScript引发的错误消息

  •  0
  • Langlois.dev  · 技术社区  · 7 年前

    我很难测试代码中的错误是否成功抛出了正确的消息。发生的情况是,错误正确抛出,但我的测试失败了。

    模块:

    // users.ts
    const database = require('../databases/postgres');
    
    module.exports = {
      create: async (req, res, next) => {
        try {
            if (!req.body.email) {
                throw new Error('email needed');
            }
    
            const userCreated = await database.createUser(user);
    
            userCreated ? res.status(200).send('success') : res.status(409).send('user already exists');
        } catch(err) {
            next(err);
        }
      }
    }
    

    测试:

    // users.test.ts
    const expect = require('chai').expect;
    const users = require('./users');
    
    describe('create()', () => {
        it('should send an error if the user does not have an email', (done) => {
            const fakeReq = {
                body: {
                    password: 'abc'
                }
            };
            const fakeRes = {};
    
            expect(() => {
                users.create(fakeReq, fakeRes, done)
            }).to.throw(Error, 'email needed')
        });
    });
    

    enter image description here

    我对这个问题感到慌乱,不确定这是我的测试,是chai/typescript不兼容,还是我正在尝试使用async/await?我感谢你的帮助。

    1 回复  |  直到 7 年前
        1
  •  0
  •   Langlois.dev    7 年前

    瓦莱克斯的评论引导我走上了正确的道路。我将抛出的错误从try/catch块中移出,并且继续使用Chai的Chai作为承诺模块。下面是为我编写的代码示例。

    // users.ts
    module.exports = {
        create:  async (req, res, next) => {
            if (!userInput.email) {
                throw new Error('email needed');
            }
    
            try {
                const userCreated = await database.createUser(user);
    
                userCreated ? res.status(200).send('success') : res.status(409).send('user already exists');
            }
            catch(err) {
                next(err);
            }
        }
    };
    

    规格

    // users.test.ts
    const expect = require('chai').expect;
    const users = require('./users');
    const chaiAsPromised = require("chai-as-promised");
    
    require('chai').use(chaiAsPromised);
    
    describe('create()', () => {
        it('should send an error if the user does not have an email', (done) => {
            const fakeReq = {
                body: {
                    password: 'abc'
                }
            };
            const fakeRes = {};
    
            return expect(users.create(fakeReq, fakeRes)).to.be.rejectedWith(Error, 'email needed');
        });
    });