我正在使用赛普拉斯间谍来测试客户端分析。
我在此测试中的目的是确认$(document).ready(function(){
$("a").on('click', function(event) {
if (this.hash !== "") {
event.preventDefault();
var hash = this.hash;
$('html, body').animate({
scrollTop: $(hash).offset().top
}, 800, function(){
window.location.hash = hash;
});
}
});
});
的调用方式如下:
identify
我将间谍挂钩到identify('myemail@email.com', { groupId: 1002, groupName: "myGroup", someProp: 1, anotherProp: 2 })
中全局analytics
对象上的发射器事件中(请注意window:before:load
循环是为了处理库加载中的延迟):
while
此处的意图是,每次调用Cypress.on("window:before:load", async (win: Window) => {
const sleep = (n = 1) => new Promise(r => setTimeout(r, n));
let set = false;
while (set === false) {
if (win["analytics"]) {
set = true;
const a = win["analytics"];
const pageSpy = cy.spy().as("page");
const idSpy = cy.spy().as("identify");
a.on("page", pageSpy);
a.on("identify", idSpy);
} else {
// default sleep of 1ms. this is b/c there's a super tight
// window from analytics init and the calls I'm looking to
// track (~25ms)
await sleep();
continue;
}
}
});
或page
方法时,都会使用identify
/ page
调用中的参数来调用间谍。
然后,在我的测试中:
identify
第一个断言通过( it("calls identify on page load", () => {
const idProps = {
groupId: 1002,
groupName: "myGroup",
someProp: 1,
anotherProp: 2
};
cy.visit("https://mypage.com");
cy.get("@identify").should(
"be.calledWith",
"myemail@email.com"
).and("be.calledWith",idProps);
});
)。
但是,第二个断言失败:
"be.calledWith", "myemail@email.com"
我尝试使用Command: get
cypress_runner.js:141344 Alias: @identify
cypress_runner.js:141344 Yielded: ƒ identify
cypress_runner.js:141344 Error: CypressError: Timed out retrying: expected identify to have been called with arguments Object{4}
The following calls were made:
identify("myemail@email.com", Object{4}, undefined) at o.proxy (https://exmaple.com/__cypress/runner/cypress_runner.js:45839:22)
,但尝试使用isn't supported in Cypress' version of sinon。
我也尝试提取原始调用/参数(即sinon.match
),但是通过别名(即spy.getCalls()
)访问间谍时似乎不支持此功能。
所以:有什么办法可以深匹配传递给柏树间谍的参数?
答案 0 :(得分:2)
我已经解决了OP标题中的问题。将分析方法包装到间谍中是另一个问题,但是我更新了OP中的代码段以反映我如何解决该问题(即,将睡眠间隔更改为1ms)。
您可以使用cy.should
的回调签名在间谍调用的参数中声明对象:
const idProps = {
groupId: 1002,
groupName: "myGroup",
someProp: 1,
anotherProp: 2
};
cy.get("@identify").should(a => {
expect(a).to.be.calledWith("myemail@email.com");
// pardon the property index-ref style, using typescript and i'm lazy
const spy = a["getCalls"]();
const { args } = spy[0];
expect(args[1]).to.deep.equal(idProps);
});