掌握chai測試.catch()塊的正確使用方法
P粉242535777
P粉242535777 2023-09-02 12:25:27
0
1
363

我正在努力透過我的程式碼庫的端對端測試來實現良好的覆蓋率,所以我也想測試 .catch() 程式碼。

我的API使用node.js和mongoose。

我使用chai和mocha進行測試。

我嘗試了類似以下的程式碼:

檔案 src/controllers/user.controller.js:

const User = require("../models/user.model"); const getUser = async(req, res) => { try { const user = await User.findOne({name: req.name}); return res.status(200).json(user); } catch (err) { // 這是我想要測試的程式碼 console.error(`查找使用者 ${req.name} 時發生錯誤:`, err); return res.status(err.code).json({ message: err }); } }

檔案 src/models/user.model.js:

const mongoose = require("mongoose"); const UserSchema = mongoose.Schema({ name: { type: String, required: "Name is required", }, }); module.exports = mongoose.model("User", UserSchema);

檔案 test/user.test.js:

const chai = require("chai"); const chaiHttp = require("chai-http"); const spies = require("chai-spies"); const User = require("../src/models/user.model"); chai.use(chaiHttp); chai.use(spies); chai.should(); describe("應處理mongoose錯誤", function() { describe("有問題的User.findOne方法", function() { const _User_findOne_Backup = User.findOne; beforeEach(function() { // 這個函數應該要重載真正的findOne函數,但它沒有成功!User.findOne = function() { return Promise.reject("強制錯誤"); }; }); afterEach(function() { // 每個測試後都恢復真正的函數 User.findOne = _User_findOne_Backup; }); it("註冊應該回傳伺服器錯誤", function() { const spy = chai.spy(); return chai .request(server) .post("/api/getUser") .send({name: "Alice"}) .then(spy) .catch((err) => { const res = err.response; res.should.have.status(500); }) .then(() => { spy.should.not.have.been.called(); }) ; }); }); });

問題是在我的測試中,偽造的User.findOne() 方法從未被呼叫:原始的mongoose findOne 方法被呼叫成功,所以getUser 方法從不拋出異常,導致我的測試失敗...

可能我漏掉了一些明顯的東西,但我真的找不到它... :-(

如果需要更多的程式碼或上下文,請告訴我...

更新: 根據 @Bergi 的建議,我添加了關於我的(簡化的)模型和所需模組的完整資訊...

P粉242535777
P粉242535777

全部回覆 (1)
P粉610028841

對我來說很好用。

例如:

user.model.js

const mongoose = require("mongoose"); const UserSchema = mongoose.Schema({ name: { type: String, required: "Name is required", }, }); module.exports = mongoose.model("User", UserSchema);

user.controller.js

const User = require("./user.model"); const getUser = async (req, res) => { try { const user = await User.findOne({ name: req.body.name }); return res.status(200).json(user); } catch (err) { console.error(`Error finding user ${req.body.name}:`, err); return res.status(500).json({ message: err }); } } module.exports = { getUser }

server.js

const express = require('express'); const userController = require('./user.controller'); const app = express(); app.use(express.json()) app.post('/api/getUser', userController.getUser) module.exports = app;

user.test.js

const chai = require("chai"); const chaiHttp = require("chai-http"); const User = require("./user.model"); const server = require('./server'); chai.use(chaiHttp); chai.should(); describe("should handle mongoose errors", function () { describe("faulty User.findOne method", function () { const _User_findOne_Backup = User.findOne; beforeEach(function () { User.findOne = function () { return Promise.reject("forced error"); }; }); afterEach(function () { User.findOne = _User_findOne_Backup; }); it("signup should respond with a server error", function () { return chai .request(server) .post("/api/getUser") .send({ name: "Alice" }) .catch((err) => { const res = err.response; res.should.have.status(500); }) ; }); }); });

測試結果:

should handle mongoose errors faulty User.findOne method Error finding user Alice: forced error ✓ signup should respond with a server error 1 passing (21ms) --------------------|----------|----------|----------|----------|-------------------| File | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s | --------------------|----------|----------|----------|----------|-------------------| All files | 89.19 | 100 | 88.89 | 88.57 | | server.js | 100 | 100 | 100 | 100 | | user.controller.js | 80 | 100 | 100 | 75 | 6,7 | user.model.js | 100 | 100 | 100 | 100 | | user.test.js | 88.89 | 100 | 85.71 | 88.89 | 26,27 | --------------------|----------|----------|----------|----------|-------------------|

軟體套件版本:

"chai": "^4.2.0", "chai-http": "^4.3.0", "mongodb": "^3.6.3", "mongoose": "^5.11.9", "express": "^4.17.1"
    最新下載
    更多>
    網站特效
    網站源碼
    網站素材
    前端模板
    關於我們 免責聲明 Sitemap
    PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!