我正在尝试编写一个模仿慢速API的赛普拉斯测试,因此在阅读了一些文档之后,我想到了这一点:
before(function() {
cy.server({delay: 5000});
});
beforeEach(() => {
cy.route({
method: "GET",
url: "**/api/**"
});
cy.visit("http://localhost:9000");
});
那应该给所有向API
发出的请求增加5秒的延迟,对吧?
我看到的问题是,即使有许多对*/api/*
的调用,它也无法匹配任何请求。
赛普拉斯GUI确实看到了路线...它只是不匹配。
这可能是什么原因?
答案 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)
答案 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
},
})
});