如何嘲笑我的测试类进行的导入?

时间:2019-06-12 12:50:22

标签: javascript testing mocking jestjs

我正在尝试为我的数据库搜寻器程序设置测试,但是我无法替换正在测试的类方法。

为了避免写下过多的代码,我将列出问题的一般形式。在我的测试函数中,我有:

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硬编码为有效对象时,代码工作正常,我只是找不到一种方法可以通过将该对象注入代码中测试功能。

2 个答案:

答案 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);
  })
})