Chai test.catch() ブロックの正しい使い方をマスターする
P粉242535777
P粉242535777 2023-09-02 12:25:27
0
1
583
<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>
P粉242535777
P粉242535777

全員に返信(1)
P粉610028841

私にとってはとても効果的です。

###例えば:###

user.model.js

リーリー

user.controller.js

リーリー

server.js

: リーリー

user.test.js

リーリー ###試験結果:### リーリー パッケージバージョン:

リーリー
いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート