node.js - 是什么导致此 Mocha 测试超时?
问题描述
我正在使用 React、Redux、Express、MongoDB 和 Mocha 开发一个全栈 Web 应用程序,并且在编写处理使用 Sinon 模拟/存根 Mongoose 模型的测试时遇到了麻烦。目前我正在尝试测试此路由处理程序以创建用户帐户:
import md5 from "md5";
import { User } from "../models";
import { UserCreationStatuses } from "../../app/store/action-types";
export async function postCreateUser(req, res) {
let { username, password } = req.body;
if (await User.exists({ name: username })) {
return res.status(500).send({ reason: UserCreationStatuses.USERNAME_TAKEN });
} else {
let newUser = new User({
name: username,
passwordHash: md5(password),
});
newUser.save((err) => {
if (err) {
console.info("Error in user creation route:\n", err);
return res.status(500).send({ reason: UserCreationStatuses.SERVER_ERROR });
}
return res.status(200).send();
});
}
}
这是我目前陷入困境的测试(有一些省略号,我省略了其他测试)。我假设我通过exists
为我的 Mongoose 模型“用户”存根函数引起了问题:
import { assert, expect } from "chai";
let chai = require("chai");
let should = require("chai").should();
import httpMocks from "node-mocks-http";
import sinon from "sinon";
import { User } from "../models";
import { UserCreationStatuses } from "../../app/store/action-types";
import { postCreateUser } from "../route-handlers/user-creation";
describe("Route Handlers", function () {
describe("User Creation", function () {
beforeEach(function () {
sinon.stub(User, "exists");
});
afterEach(function () {
User.exists.restore();
});
...
it("should respond with a code of 500 when provided with an existing username, and any password", async function (done) {
this.timeout(10000);
let req = httpMocks.createRequest({
method: "POST",
url: "/create-user",
body: {
username: "ExistingUser",
password: "AnyPassword"
}
});
let res = httpMocks.createResponse();
User.exists.resolves(true);
await postCreateUser(req, res);
res.status.should.equal(500);
done();
});
});
...
});
在我的测试输出中,“应该以 500 的代码响应”测试给出了这个错误:
Error: Timeout of 10000ms exceeded. For async tests and hooks, ensure "done()" is called; if returning a Promise, ensure it resolves. (F:\Web\what-about-a-band-called\src\server\route-handlers\route-handlec.js)
正如您在测试中看到的那样,我曾尝试延长 Mocha 的超时时间,但这并没有改变任何东西。关于发生了什么的任何想法?我对使用 Sinon 存根方法非常陌生,我假设我直接跳入异步方法和 Mongoose 有点过头了。此外,如果这里没有足够的线索,这里是完整的回购。
解决方案
所以,经过更多的故障排除后,我设法让它工作,但我对它为什么会这样感到困惑!首先,我res.status
在断言中使用错误,我应该一直使用.statusCode
. 我现在感到困惑的部分是,解决真正问题的方法是既不调用done()
也不将其作为参数传递给it
. 在引入.statusCode
而不是之后.status
,我得到了以下错误:
Error: Resolution method is overspecified. Specify a callback *or* return a Promise; not both.
删除done()
调用但保留done
回调参数后,我得到以下信息:
Error: Timeout of 10000ms exceeded. For async tests and hooks, ensure "done()" is called; if returning a Promise, ensure it resolves.
删除done
完全解决问题!那么,我认为问题出在正确(或接近正确?)是正确的吗await postCreateUser(req, res);
?那个电话既是返回又是解决一个承诺?
推荐阅读
- python - 如何使用 subprocess 为我的 Java 程序提供多个输入?
- google-calendar-api - Google 日历频道(事件:观看)的寿命有多长?
- java - 带有模拟上下文的 Volley 中的 NoClassDefFoundError
- google-apps-script - 导入 html 不适用于某些网站
- reactjs - 材料 ui 谷歌地图的地方
- java - 如何让我的 MouseListener 方法在 Java 中工作?
- javascript - 在滚动顶部闪烁
- flutter - 在 flutter_local_notifications 中添加 mp3 声音
- assembly - 为什么这个数组指针移动了 1?
- vue.js - 如何在 vue-cli / webpack 项目的编译过程中禁用 SSI 解析?