在赛普拉斯中如何对带有间谍的物体断言?

时间:2018-09-11 00:03:48

标签: javascript sinon cypress

我正在使用赛普拉斯间谍来测试客户端分析。

我在此测试中的目的是确认$(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())访问间谍时似乎不支持此功能。

所以:有什么办法可以深匹配传递给柏树间谍的参数?

1 个答案:

答案 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);
    });