문제점 : 테스트 코드의 일부분 중 API를 호출 하는 부분에서 401 오류가 발생했다
const configuration = new Configuration({
organization: process.env.OPENAI_OG,
apiKey: process.env.OPENAI_APIKEY,
});
const openai = new OpenAIApi(configuration);
시도해본 것 : 환경변수를 BeforeEach로 테스트 코드에 집어 넣고 실행시키면 작동했다. 하지만 이렇게 하는것은 mock 데이터를 사용하는 유닛테스트에서 옳지 않다고 생각했고 어떻게 하면 mock 데이터를 가져올 수 있을까 고민했다.
해결 : 우선 OpenAIApi를 코드에서 분리해서 메서드로 만들고 그것을 this로 가져온다.
/**
* test : OpenAI 테스트입니다.
* @returns
*/
getOpenAIApiInstance(): OpenAIApi {
const configuration = new Configuration({
organization: process.env.OPENAI_OG,
apiKey: process.env.OPENAI_APIKEY,
});
return new OpenAIApi(configuration);
}
...
const openai = this.getOpenAIApiInstance();
그리고 jest.mock을 사용해 OpenAIApi 전체를 모의한다.
jest.mock('openai', () => {
return {
OpenAIApi: jest.fn().mockImplementation(() => {
return {
createCompletion: jest.fn().mockImplementation(() => {
return Promise.resolve({
data: {
choices: [
{
text: 'Mocked AI response',
},
],
},
});
}),
};
}),
Configuration: jest.fn().mockImplementation(() => {
return {
};
}),
};
});
이 방법으로 OpenAIApi의 모든 메소드를 가짜로 만들 수 있으며, 테스트에서 필요한 메소드만 특정 동작을 수행하도록 설정할 수 있다.
jest.mock이 'openai' 모듈 전체를 모의하므로, 이제 OpenAIApi 인스턴스는 Jest에 의해 자동으로 제공된다.
jest.mock은 Jest 테스팅 프레임워크의 기능 중 하나로, 특정 모듈의 모의 구현(mock implementation)을 제공하는데 사용된다. 이는 테스트 환경에서 실제 모듈 대신 사용할 수 있는 가짜 모듈을 생성하는 것이다.
jest.mock는 두 가지 인수를 받는다.
문자열로 된 모듈 경로: 이 경로는 모의화하려는 모듈을 가리킨다.
함수: 이 함수는 모듈의 모의 구현을 반환한다. 이 인수는 선택 사항이며, 제공되지 않으면 Jest는 모듈의 자동 모의(즉, 모든 함수가 가짜 함수로 대체되는 모듈)를 생성한다.