chai test.catch() 블록의 올바른 사용을 마스터하세요
P粉242535777
2023-09-02 12:25:27
<p>내 코드 베이스의 엔드투엔드 테스트를 통해 좋은 적용 범위를 얻으려고 노력하고 있으므로 <code>.catch()</code> 코드도 테스트하고 싶습니다. </p><p>
내 API는 node.js와 몽구스를 사용합니다. </p><p>
테스트에는 chai와 mocha를 사용합니다.</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 = wait 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("몽구스");
const UserSchema = 몽구스.스키마({
이름: {
유형: 문자열,
필수: "이름이 필요합니다",
},
});
module.exports = mongoose.model("User", UserSchema);</pre>
<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("chai-spies");
const User = require("../src/models/user.model");
chai.use(chaiHttp);
chai.use(스파이);
chai.should();
explain("몽구스 오류는 처리되어야 합니다.", function() {
explain("문제가 있는 User.findOne 메서드", function() {
const _User_findOne_Backup = User.findOne;
beforeEach(함수() {
// 이 함수는 실제 findOne 함수를 오버로드해야 하지만 성공하지 못했습니다!User.findOne = 함수() {
return Promise.reject("강제 오류");
};
});
afterEach(function() { //각 테스트 후에 실제 함수를 복원합니다.
User.findOne = _User_findOne_Backup;
});
it("등록은 서버 오류를 반환해야 합니다.", function() {
const spy = chai.spy();
반환 차이
.request(서버)
.post("/api/getUser")
.send({이름: "앨리스"})
.그러면(스파이)
.catch((err) => {
const res = 오류.응답;
res.should.have.status(500);
})
.then(() => {
spy.should.not.have.been.call();
})
;
});
});
});</pre>
<p>문제는 내 테스트에서 가짜 <code>User.findOne()</code> 메서드가 호출되지 않는다는 것입니다. 원래의 몽구스 <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
:테스트 결과:
으아악패키지 버전:
으아악