如何使用Jest模拟Apollo服务器RESTDataSource进行单元测试? [英] How do you mock an Apollo Server RESTDataSource for unit testing with Jest?

查看:21
本文介绍了如何使用Jest模拟Apollo服务器RESTDataSource进行单元测试?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试测试我的Apollo Server中基于Apollo Server的RESTDataSource(https://www.apollographql.com/docs/apollo-server/data/data-sources/#rest-data-source)的数据源。我正在尝试使用Jest来测试它。该类具有从外部REST API以及从调用第二个API的另一个模块拉入数据的方法(因此RESTDataSource最终依赖于两个外部API,其中一个在这里被直接调用,另一个被间接调用)。

我不是测试专家,我不清楚如何模拟外部API。GraphQL工具有一些工具可以让您mock your server,但我不确定这是我想要的。或者我应该使用Jest's methods for mocking ES6 classes,忘记这是一台GraphQL服务器?如果是这样的话,由于我使用的是class,我是否只是使用类似于MyClass.myMethod的内容来模拟这些方法作为模拟方法?

除了将Jest设置为使用TypeScrip之外,如果我使用TypeScrip(我就是这样),我的操作方式是否会发生变化?

显然正确的路线是在上面的选项中选择一个,但我有点"只见树木不见森林",也就是说,由于我缺乏测试经验,我不知道哪条路线才是正确的路线。

谢谢您的任何提示。

推荐答案

单元测试

您可以按照apollo-datasource-rest + Typescript + Jest in the Apollo Spectrum chat中的建议,通过模拟apollo-datasource-rest中的RESTDataSource来对数据源进行单元测试。

对于此数据源:

import { RESTDataSource } from 'apollo-datasource-rest'

export class MyRestDataSource extends RESTDataSource {
  async getStackoverflow(): Promise<string> {
    return this.get('https://stackoverflow.com/')
  }
}

您可以像这样编写单元测试:

import { MyRestDataSource } from './MyRestDataSource'

const mockGet = jest.fn()
jest.mock('apollo-datasource-rest', () => {
  class MockRESTDataSource {
    baseUrl = ''
    get = mockGet
  }
  return {
    RESTDataSource: MockRESTDataSource,
  }
})

describe('MyRestDataSource', () => {
  it('getStackoverflow gets data from correct URL', async () => {
    const datasource = new MyRestDataSource()

    await datasource.getStackoverflow()

    expect(mockGet).toBeCalledWith('https://stackoverflow.com/')
  })
})

集成测试

在大多数情况下,我宁愿使用apollo-server-testing进行集成测试,而不是对数据源进行单元测试:在服务器上运行GraphQL并测试从解析器到数据源的整个路径。如果这样做,请考虑使用例如nock来模拟数据源发出的HTTP请求。

打字稿

无论您使用的是TypeScrip还是JavaScript,一般的方法都应该是相同的,只是有一些细微的区别。例如,使用JavaScript,您的单元测试可以直接替换数据源中的get

const MyRestDataSource = require('./MyRestDataSource')

describe('MyRestDataSource', () => {
  it('getStackoverflow gets data from correct URL', async () => {
    const datasource = new MyRestDataSource()
    datasource.get = jest.fn()
    await datasource.getStackoverflow()

    expect(datasource.get).toBeCalledWith('https://stackoverflow.com/')
  })
})

但使用类型脚本会导致编译器错误,因为get受到保护:

MyRestDataSource.est.ts:6:16-错误TS2445:属性""Get""受保护,并且只能在类""RESTDataSource""及其子类中访问。

这篇关于如何使用Jest模拟Apollo服务器RESTDataSource进行单元测试?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆