我正在尝试为我的数据库搜寻器程序设置测试,但是我无法替换正在测试的类方法。
为了避免写下过多的代码,我将列出问题的一般形式。在我的测试函数中,我有:
describe("test",()=>{
let result1;
beforeAll(async ()=>{
await createConnection();
})
afterAll(async ()=>{
getConnection().close();
})
test("setup test",async () => {
result1 = await WeatherController.startForecastAPI();
expect(result1.status).toBe(Status.SUCCESS);
})
})
WeatherController.ts文件(...取出代码的位置):
...
import AccessTokenService from '../services/AccessTokenService';
export default class WeatherController{
...
static async startForecastAPI(){
...
const accessToken = AccessTokenService.getAccessToken();//get and validate token
...
}
}
在WeatherController类中,startForecastAPI被定义为静态异步方法。该类导入多个其他类,其中包括AccessTokenService类,该类用于获取有效的访问令牌。 AccessTokenService.getAccessToken()应该返回一个对象,该对象具有通过http请求获取的多个属性。
我想模拟调用AccessTokenService的结果,但是我没有在测试函数中直接调用它,而是调用WeatherController,而WeatherController正在调用AccessTokenService。测试时如何替换WeatherController调用的内容,而又不触碰WeatherController代码?我已经尝试过开玩笑的文档,但是我对所有这些都还很陌生,而且令人困惑。我也不完全清楚范围定义在这里的工作方式(我尝试在测试代码中定义一个函数,然后在被测试的函数中调用它,但超出范围)。
测试函数中的await WeatherController.startForecastAPI()调用返回未定义,但是当我将accessToken硬编码为有效对象时,代码工作正常,我只是找不到一种方法可以通过将该对象注入代码中测试功能。
答案 0 :(得分:3)
假设AccessTokenService.getAccessToken返回一个promise或是一个异步函数,那么您可以使用jest.spyOn(...)。mockResolvedValue()防止调用服务器
describe("test",()=>{
let result1;
beforeAll(async ()=>{
await createConnection();
})
afterAll(async ()=>{
getConnection().close();
})
test("setup test",async () => {
const expectedResultFromGetToken = {property: 'property 1'};
const getTokenSpy = jest.spyOn(AccessTokenService, 'getAccessToken')
.mockResolvedValue(expectedResultFromGetToken)
result1 = await WeatherController.startForecastAPI();
expect(result1.status).toBe(Status.SUCCESS);
expect(getTokenSpy).toHaveBeenCalled()
})
})
如果AccessTokenService.getAccessToken不是异步函数,则必须使用jest.spyOn(...)。mockReturnValue()
答案 1 :(得分:0)
如果在课堂上有
const AccessToken = require('access-token');
您可以使用
进行模拟jest.mock('access-token', () => {
function getToken() {
return 'fakeToken'
}
);
const WeatherController = require('weather-controller');
describe("test",()=>{
let result1;
beforeAll(async ()=>{
await createConnection();
})
afterAll(async ()=>{
getConnection().close();
})
test("setup test",async () => {
result1 = await WeatherController.startForecastAPI();
expect(result1.status).toBe(Status.SUCCESS);
})
})