typescript 剧作家API测试:拦截API请求

epggiuax  于 2022-11-26  发布在  TypeScript
关注(0)|答案(1)|浏览(124)

bounty将在3天后过期。回答此问题可获得+300的声望奖励。J. Hesters正在寻找来自知名来源的答案:在用Playwright进行API测试时,有没有办法拦截服务器正在执行的请求,以便您可以在测试中访问它?

我使用npm run dev运行服务器。
我正在用Playwright的API测试来测试服务器。
我有一个简单的GET路由,它总是返回一个405不允许。它还记录API路由被调用。为了这个StackOverflow例子,我用fetch替换了这个日志到一个保持器API。

export const loader = async () => {
  await fetch('https://jsonplaceholder.typicode.com/todos/1')
    .then(response => response.json())
    .then(json => console.log(json));
  return notAllowed();
};

在我的API测试中,我希望截取对占位符API的fetch请求,并验证它是否被调用,而不是实际调用它。
当你用Playwright编写一个普通的浏览器测试时,你可以使用page.route

page.route('*', route => {
  console.log('url', route.request().url());
  route.continue();
});

但是,由于这是一个API测试,并且不在页面中运行,因此这不会起作用。
如何截取API请求以对其进行Assert?
我尝试使用以下内容创建新上下文:

test('my test', async ({ playwright }) => {
  const context = await playwright.request.context();
});

context对象实际上是request对象,因此不能运行request.on。我还尝试使用默认fixture中的context参数,但也不起作用。

bvjveswy

bvjveswy1#

编写API测试:

Playwright Test附带了内置的请求fixture,它尊重配置选项,可以像下面这样用来发送和Assert一些请求。

const { test, expect} = require('@playwright/test');

test('should get and assert an request', async ({ request }) => {
  const issues = await request.get(`https://jsonplaceholder.typicode.com/todos/1`);
  expect(issues.ok()).toBeTruthy();
  expect(await issues.json()).toEqual(expect.objectContaining({
   "userId": 1,
   "id": 1,
   "title": "delectus aut autem",
   "completed": false
  }));
});

相关问题