搜尋

首頁  >  問答  >  主體

監視window.clearInterval函數的cy.spy

<p>在我正在開發的應用程式中,我使用 setInterval 和 clearInterval。我想要監視 clearInterval 方法,以便查看是否呼叫了該方法。以下是我實際上在做的事情:</p> <pre class="brush:php;toolbar:false;">beforeEach(() => { cy.clock(new Date()) }) it('測試場景' => { const fn = cy.spy(document.defaultView, 'clearInterval') //也試過 fn = cy.spy(window, 'clearInterval') … … … //進入`then`部分時會呼叫 clearInterval 函數,但存根報告它尚未被調用 cy.tick(30000).then(() => { expect(fn).to.have.been.calledOnce }) }) afterEach(() => { cy.clock().invoke('restore') })</pre> <p>上面程式碼段中的 expect 斷言失敗,我期望它通過。我初始化 spy 的邏輯是否有效|正確?非常感謝對上述問題的任何幫助。 </p>
P粉023326773P粉023326773461 天前463

全部回覆(1)我來回復

  • P粉745412116

    P粉7454121162023-08-18 10:40:22

    Cypress在測試和應用程式中使用不同的windowcy.spy(window...使用的是測試窗口,但要對應用程式視窗進行監視,您需要使用cy.window()命令。

    let spy;
    cy.window().then(appWindow => {
      spy = cy.spy(appWindow, 'clearInterval')
    })
    
    ... later
    
    expect(spy).to.have.been.calledOnce
    

    但可能會有另一個複雜性,因為cy.clock()clearInterval()放在代理程式中,以便可以控制應用程式的定時函數,所以您可能無法對其進行監視。

    如果發現仍然無法正常運作,請取得cy.clock()的回傳值,並查看是否附有呼叫資訊。

    let clock;
    beforeEach(() => {
      clock = cy.clock(new Date())
    })
    

    或指定clearInterval不應該被代理

    beforeEach(() => {
      cy.clock(new Date(), ['Date', 'setInterval'])  // 仅代理Date和setInterval
    })
    

    回覆
    0
  • 取消回覆