使用 Mock Service Worker 时如何对 graphql 查询变量进行断言?
Posted
技术标签:
【中文标题】使用 Mock Service Worker 时如何对 graphql 查询变量进行断言?【英文标题】:How to make assertions on graphql query variables when using Mock Service Worker? 【发布时间】:2021-03-21 04:41:07 【问题描述】:当我们使用模拟服务工作者 (MSW) 模拟 graphql 查询时,我们希望断言传递给查询的变量具有特定值。这超出了打字稿类型的类型验证。我们正在用 MSW 开玩笑。您是否监视 MSW 以做出这些断言?还是有其他方法可以期望req.variables
具有一定的价值。
graphql.query<SaveContent, SaveContentVariables>('SaveContent', (req, res, ctx) =>
return res(
ctx.data(
saveContent:
success: true,
id: req.variables.id,
errors: [],
,
)
);
)
【问题讨论】:
如果你将SaveContentVariables
类型传递给 graphql.query
泛型函数,TypeScript 类型应该可以工作
见mswjs.io/docs/api/graphql/query#usage-with-typescript
我想检查这个值是一个特定的值而不是形状。所以它在数组中有这些项目,而不是它只是一个数组。
【参考方案1】:
Mock Service Worker 建议将您的请求断言基于 UI(在Request assertions 配方中了解更多信息)。在大多数情况下,如果您的请求/响应数据是正确的,那么您的 UI 在测试中就是正确的。相反的情况也是如此。尽可能断言数据驱动的 UI。
在您的情况下,您希望在请求中声明查询变量。考虑根据这些变量返回数据,这些变量稍后会产生相应的 UI。
当您发现绝对有必要在 UI 之外执行直接请求/响应断言时,请使用允许执行任意逻辑以响应各种 MSW 事件的Life-cycle events。例如,您可以通过以下方式在测试中声明请求变量:
const server = setupServer(...handlers)
it('saves the content', async () =>
expect.assertions(1)
server.on('request:match', (req) =>
expect(req.variables).toEqual( id: 'abc-123' )
)
await performQuery(...)
)
【讨论】:
以上是关于使用 Mock Service Worker 时如何对 graphql 查询变量进行断言?的主要内容,如果未能解决你的问题,请参考以下文章