网站搜索

javascript - 使用 axios-mock-adapter 的 onPost() 是否可能进行部分数据匹配?


环境:

NodeJS 8.1.2
axios 0.16.2
axios-mock-adapter 1.9.0

使用 JSONPlaceholder 的测试 POST API 调用如下:

const expect = require('chai').expect
const MockAdapter = require('axios-mock-adapter')

// Bootstrapping

const PlaceholderApp = {
  createComment: function (author, email, message) {
    const options = {
      method: 'post',
      url: 'https://jsonplaceholder.typicode.com/comments',
      data: {
        name: author,
        email: email,
        body: message,
      }
    }
    return axios(options)
  }
}

// Mock Adapter

const mockHttpClient = new MockAdapter(axios, { delayResponse: 50 })
// mockHttpClient.onPost(/(\/comments)/i, { name: 'author A', email: '[email ', body: 'test comment' }).reply(526) // WORKS!
mockHttpClient.onPost(/(\/comments)/i, { email: '[email ' }).reply(527) //This won't work. Would like to have something like this to work tho...
mockHttpClient.onAny().passThrough()

// Test cases

describe('PlaceholderApp.createComment', () => {
  it("should fail due to mock...", (resolve) => {
    PlaceholderApp.createComment('author A', '[email ', 'test comment')
      .then((res) => {
        resolve()
      })
      .catch((err) => {
        resolve(err)
      })
  })
})

我想知道是否有办法能够匹配 POST 数据的部分内容?

答案#1

你可以捕获所有对特定 URL 的 POST 请求,然后在 reply 回调中手动匹配你的条件,如果条件不满足,可以使用 passThrough,我们可以在 reply 回调中通过将调用传递给 originalAdapter 来实现 passThrough,就像你在另一个问题中回答的那样。

mockHttpClient.onPost(/(\/comments)/i).reply((config) => {
  const data = JSON.parse(config.data);

  if (data.email == '[email ') {
    return [200, 'response'];
  } else {
    // passThrough
    return mockHttpClient.originalAdapter(config);
  }
})

注意:如果提供的数据不同,你可以对同一个 URL 有多个 完全匹配 数据,但对于我们自己的 部分匹配 实现,你不能对同一个 URL 和 方法 添加另一个请求,你必须将匹配所有所需情况的逻辑添加到一个请求中。

答案#2

自 v1.18.0 版本(2020年3月22日)起,支持 asymmetricMatch。

mockHttpClient.onPost(/(\/comments)/i, {
  asymmetricMatch: (actual) => actual.email === '[email '
}).reply(527)