如何用 Chai 测试错误?

如何解决如何用 Chai 测试错误?

我正在测试获取用户的 api 路由。它运作良好。现在,我想测试如果我获取一个不存在的用户,该路由是否会引发错误显示正确的消息。测试声称是肯定的,但我知道这不是因为我无法 console.log 结果或 .end() 回调中的错误。这是测试和路线:

require("dotenv").config();
import chai from "chai";
import chaiHttp from "chai-http";
import connectToDatabase from "../database/connection";
import { app } from "../index";
import jwt from "jsonwebtoken";

chai.use(chaiHttp);
const api = chai.request(app);

before((done) => {
  connectToDatabase().then(() => done());
});

const token = jwt.sign(
  { _id: "123",locale: "en" },process.env.JWT_TOKEN_KEY,{
    expiresIn: "14d",}
);

describe("GET /user/:id",() => {
  it("return user information",() => {
    api
      .get("/user/607183db2020190b510bd9a5")
      .set("Cookie",`mycookie=${token};`)
      .end((err,res) => {
        chai.expect(res).to.have.status(200);
        chai.expect(res.body.user._id).to.equal("607183db2020190b510bd9a5");
      });
  });
  it("throws an error if the user doesn't exist",() => {
    api
      .get("/user/abc")
      .set("Cookie",res) => {
        console.log("res Failed ok",res,"eeror",err); // this line never shows up
        chai.expect(err).to.throw("error.unkNown");
      });
  });
});



// the route:
const getUser = async (
  req: GetUser,res: IResponse
): Promise<IResponse> => {
  try {
    const user = await UserControler.findUserById(req.params.id);
    return res.status(200).json({ user });
  } catch (err) {
    throw new Error("error.unkNown");
  }
};

export default getUser;

如何解决这个问题?

解决方法

如此处所述(警告部分)https://www.chaijs.com/plugins/chai-http/,您在使用 end() 函数时需要使用 done。

因为 end 函数传递了一个回调,所以运行断言 异步。因此,必须使用一种机制来通知 回调已完成的测试框架。否则, 测试将在检查断言之前通过。

这会导致您的测试一直等到 done() 被调用。 end() 函数在您的请求完成后运行。传递 done 参数使 mocha 等待直到 done() 被调用或超时。如果您不使用它,则无需等待响应即可测试成功。

所以你应该在你的测试中这样做(注意第一个测试中的变化):

describe("GET /user/:id",() => {
  it("return user information",(done) => {
    api
      .get("/user/607183db2020190b510bd9a5")
      .set("Cookie",`mycookie=${token};`)
      .end((err,res) => {
        chai.expect(res).to.have.status(200);
        chai.expect(res.body.user._id).to.equal("607183db2020190b510bd9a5");
        done(); // here
      });
  });
  it("throws an error if the user doesn't exist",(done) => {
    api
      .get("/user/abc")
      .set("Cookie",res) => {
        console.log("res failed ok",res,"eeror",err); // this line never shows up
        chai.expect(err).to.throw("error.unknown");
        done(); // and here 
      });
  });
});

对测试函数使用箭头函数也不是最佳实践。改用 function(){。检查这个的原因 https://mochajs.org/#arrow-functions

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?