Chai test.catch() ブロックの正しい使い方をマスターする
P粉242535777
2023-09-02 12:25:27
<p>コード ベースのエンドツーエンド テストで良好なカバレッジを達成しようとしているため、<code>.catch()</code> コードもテストしたいと考えています。 </p><p>
私の API は、node.js と mongoose を使用します。 </p><p>
テストにはチャイとモカを使用します。</p>
<p>私は次のようなことを試しました: </p>
<p><em>ファイル src/controllers/user.controller.js:</em></p>
<pre class="brush:php;toolbar:false;">const User = require("../models/user.model");
const getUser = async(req, res) => {
試す {
const user = await User.findOne({name: req.name});
res.status(200).json(ユーザー)を返します。
} キャッチ (エラー) {
//これはテストしたいコードです
console.error(`ユーザー ${req.name} の検索中にエラーが発生しました:`、err);
return res.status(err.code).json({ メッセージ: err });
}
}</pre>
<p><em>ファイル src/models/user.model.js:</em></p>
<pre class="brush:php;toolbar:false;">const mongoose = require("mongoose");
const UserSchema = mongoose.Schema({
名前: {
タイプ: 文字列、
必須: 「名前は必須です」、
}、
});
module.exports = mongoose.model("User", UserSchema);
<p><em>ファイル test/user.test.js:</em></p>
<pre class="brush:php;toolbar:false;">const chai = require("chai");
const chaiHttp = require("chai-http");
const spies = require("チャイスパイ");
const User = require("../src/models/user.model");
chai.use(chaiHttp);
チャイ.使用(スパイ);
チャイ. should();
description("マングース エラーは処理する必要があります", function() {
description("問題のある User.findOne メソッド", function() {
const _User_findOne_Backup = User.findOne;
beforeEach(関数() {
// この関数は実際の findOne 関数をオーバーライドする必要がありますが、成功しませんでした。User.findOne = function() {
return Promise.reject("強制エラー");
};
});
afterEach(function() { //各テスト後に実際の関数を復元します
User.findOne = _User_findOne_Backup;
});
it(「登録するとサーバー エラーが返されるはずです」、function() {
const spy = Chai.spy();
チャイを返す
.request(サーバー)
.post("/api/getUser")
.send({名前: "アリス"})
.then(スパイ)
.catch((err) => {
const res = err.response;
res. should.have.status(500);
})
.then(() => {
スパイは呼ばれるべきではない();
})
;
});
});
});</pre>
<p>問題は、私のテストでは、偽の <code>User.findOne()</code> メソッドが呼び出されないことです。元の mongoose <code>findOne</code> メソッドは正常に呼び出されます。そのため、<code>getUser</code> メソッドは例外をスローしないため、テストが失敗します...</p>
<p>明らかな何かが欠けているかもしれませんが、本当に見つかりません... :-(</p><p>
さらにコードやコンテキストが必要な場合は、お知らせください...</p>
<p><strong>更新: </strong>
@Bergi の提案に従って、(簡略化された) モデルと必要なモジュールに関する完全な情報を追加しました...</p>
私にとってはとても効果的です。
###例えば:### user.model.js:
user.controller.jsリーリー
:
server.jsリーリー
:
user.test.jsリーリー
:
リーリーリーリー ###試験結果:### リーリー
パッケージバージョン: