如何使用Jest模拟Apollo服务器RESTDataSource进行单元测试? [英] How do you mock an Apollo Server RESTDataSource for unit testing with Jest?
问题描述
我正在尝试测试我的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屋!