Как мне противостоять объектам со шпионами в Cypress? - PullRequest
0 голосов
/ 11 сентября 2018

Я использую Cypress Spies для тестирования клиентской аналитики.

Моя цель в этом тесте - подтвердить, что 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)

Я пытался использовать sinon.match, но не поддерживается в Cypress 'версии sinon .

Я также пытался извлечь необработанные вызовы / аргументы (то есть spy.getCalls()), но, похоже, это не поддерживается при доступе к шпиону через псевдоним (т.е. cy.get('@identify')).

Итак: есть ли способ глубоко сопоставить аргументы, передаваемые кипарисам-шпионам?

1 Ответ

0 голосов
/ 12 сентября 2018

Я решил проблему в заголовке ОП. Оборачивание метода аналитики в шпиона было другой проблемой, но я обновил фрагмент в OP, чтобы отразить, как я это исправил (то есть, изменив интервал сна на 1 мс).

Вы можете утверждать объект в аргументах вызова шпиона, используя сигнатуру обратного вызова 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);
    });
...