赛普拉斯路线不匹配

时间:2019-01-11 14:26:14

标签: testing mocking cypress

我正在尝试编写一个模仿慢速API的赛普拉斯测试,因此在阅读了一些文档之后,我想到了这一点:

before(function() {
    cy.server({delay: 5000});
});

beforeEach(() => {
    cy.route({
        method: "GET",
        url: "**/api/**"
    });
    cy.visit("http://localhost:9000");
});

那应该给所有向API发出的请求增加5秒的延迟,对吧?

我看到的问题是,即使有许多对*/api/*的调用,它也无法匹配任何请求。 赛普拉斯GUI确实看到了路线...它只是不匹配。

这可能是什么原因?

4 个答案:

答案 0 :(得分:1)

对我来说,我的模式对POST请求是正确的,但问题是我没有覆盖默认响应。我只是希望API返回500错误,但是除非我指定响应,否则它将调用到真正的API端点。该文档说默认响应是一个空对象,但是由于某种原因,除非我提供一个值,否则它将通过调用。提供响应后,赛普拉斯GUI会显示它已正确挂断呼叫。

更改为:

cy.route({
    method: "POST",
    url: /my-endpoint/,
    status: 500,
});

cy.route({
    method: "POST",
    url: /my-endpoint/,
    response: {},
    status: 500,
});

对我有用。

答案 1 :(得分:0)

如果按照柏树日志中的说明放置整条路线,您可能会发现它可行。

通过minimatch似乎无法很好地实现前瞻性glob。它在/字符上定界很好,但在?#上定界不太好,因此,如果您尝试容纳查询字符串,那么可能就是这样。< / p>

您可以在控制台中使用Cypress.minimatch来查看发生了什么。有关如何执行此操作的更多信息in the docs

Cypress也将接受正则表达式。 /\/api\//之类的东西应该对您有用。

答案 2 :(得分:-1)

我假设您的匹配器不起作用,并且您的请求未显示(XHR STUB)

如果您使用的是GUI,应该会看到一个如下所示的请求

(XHR)GET 200 / YOUR_API / YOUR_ROUTE

复制该(/ YOUR_API / YOUR_ROUTE),它应该匹配

在存根后是否应该说(XHR STUB)

enter image description here

答案 3 :(得分:-1)

您是在直接请求XHR还是在使用fetch?赛普拉斯的网络存根/模拟仅适用于实际的XHR请求(获取是其自身的请求类型)。

有一个open issue(已有3年以上的历史了),并且埋在其中,与solutions的链接非常紧密,其中包括下面的一个,效果很好。

编辑:或者,您可以对您的HTTP请求使用axios,它发送实际的XHR请求而不是获取请求,因此不需要Cypress的配置。我认为生成的代码也更简洁。

  let polyfill;

  // grab fetch polyfill from remote URL, could be also from a local package
  before(() => {
    const polyfillUrl = 'https://unpkg.com/unfetch/dist/unfetch.umd.js'
    cy.request(polyfillUrl)
      .then((response) => {
        polyfill = response.body
      })
  })

  beforeEach(() => {
    cy.visit('/', {
      onBeforeLoad (win) {
        delete win.fetch
        // since the application code does not ship with a polyfill
        // load a polyfilled "fetch" from the test
        win.eval(polyfill)
        win.fetch = win.unfetch
      },
    })
  });