如何在测试咖啡厅中使用数据进行发布请求?

时间:2019-06-03 12:29:16

标签: node.js post e2e-testing testcafe web-api-testing

我是api测试的初学者,我正在使用test-cafe,并且已经编写了使用 RequestHook 发出GET请求的测试,效果很好,我能够获取数据,但是当我尝试使用相同的 RequestHook 发出POST请求时,我在发送请求时无法发送数据,因为它需要类型的缓冲区。

我无法将JSON类型的数据转换为缓冲区。发出POST请求时。 我想知道这是否是使用 RequestHook 发出POST请求的正确方法,还是我们需要使用 RequestLogger 发出{{1} }请求?如果两种方法都不正确,您可以指导我使用test-cafe进行有关api测试的任何教程!

POST

预期的结果是,发布请求成功后,它应该赋予状态200,但是目前,它无法调用上述api端点,因为它无法将JSON数据转换为缓冲区。 / p>

2 个答案:

答案 0 :(得分:3)

已创建RequestHook来模拟或记录测试请求,但不能创建请求。如果要发送请求并从服务器接收答案,请使用requestrequest-promise模块。

答案 1 :(得分:1)

我在发出API请求时使用ClientFunction。这并不理想,我相信TestCafe的积压订单上有一个t.request命令...

以下是使用ClientFunction通过fetch发送API请求的示例:

import { ClientFunction, t } from 'testcafe';

const fetchRequestClientFunction = ClientFunction((details, endpoint, method) => {
  return window
    .fetch(endpoint, {
      method,
      credentials: 'include',
      headers: new Headers({
        accept: 'application/json',
        'Content-Type': 'application/json',
      }),
      body: JSON.stringify(details),
    })
    .then(httpResponse => {
      if (httpResponse.ok) {
        return httpResponse.json();
      }
      return {
        err: true,
        errorMessage: 'There was an error trying to send the data',
      };
    });
});

const createFetchRequest = async (details, endpoint, method = 'POST') => {
  const apiResponse = await fetchRequestClientFunction(details, endpoint, method);
  await t.expect(apiResponse.err).eql(undefined, apiResponse.errorMessage);
  return apiResponse;
};

export default createFetchRequest;

我们怎么称呼它:

import createFetchRequest from '../custom_commands/createFetchRequest';
import linksAPI from '../helpers/linksAPI';

const userEndpoint = linksAPI.users;

export const createUserViaApi = async userDetails => {
  const apiResponse = await createFetchRequest(userDetails, userEndpoint);
  return { apiResponse };
};

export const updateUserViaApi = async userDetails => {
  const apiResponse = await createFetchRequest(userDetails, `${userEndpoint}/${userDetails.id}`, 'PUT');
  return { apiResponse };
};