使用 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 查询变量进行断言?的主要内容,如果未能解决你的问题,请参考以下文章

使用 mock service worker 测试 React App 时如何记录请求数?

Jest 使用 Mock Service Worker (MSW) 或其他模拟离线网络?

当我使用 Mock Service Worker 测试两个 get 请求时,为啥 req.url.searchParams 参数对象为空?

如何通过 cdn 脚本注册 service worker。如何使用外部 url 注册 service worker

web worker 与 service worker

Python接口测试实战5(下) - RESTfulWeb Service及Mock Server