簡體   English   中英

如何在Jasmine.js中使用帶有toHaveBeenCalledWith的間諜和一個可變數組?

[英]How to use a spy with toHaveBeenCalledWith and a mutable array in Jasmine.js?

我有一些代碼調用一個回調函數與一個數組作為單個參數。 調用回調后,代碼會更改數組內容。 它與此代碼類似:

function myCode( callback ) {
    var someArray = [ 1, 2, 3, 4 ];
    callback( someArray );

    // change someArray in arbitrary ways
    someArray.splice( 2 );
    ...
}

現在,我想驗證是否使用正確的數組內容調用回調。 使用Jasmine.js我會像這樣編寫我的規范:

describe( "My code", function() {
    var callback;

    beforeEach( function() {
        callback = jasmine.createSpy( "My callback" );
        myCode( callback );
    });

    it( "calls the callback and passes the correct array", function() {
        expect( callback ).toHaveBeenCalledWith( [ 1, 2, 3, 4 ] );
    });
});

這失敗了。 問題是,Jasmine.js記錄了數組,但沒有復制它。 由於在調用之后更改了數組,所以即使實際調用滿足了期望,expect() - Line也會失敗。 可變對象也會出現同樣的問題。

我該如何測試這樣的代碼?

Jasmine對傳遞給間諜的arguments淺層復制,這意味着arguments對象將引用與其調用的相同對象(在您的情況下, arguments將僅引用someArray對象)。

間諜實施的Jasmine代碼參考:

  spy = function() {
    callTracker.track({
      object: this,
      args: Array.prototype.slice.apply(arguments)
    });
    return spyStrategy.exec.apply(this, arguments);
  };

數組( arguments )的深層副本不可能作為通用解決方案,在鏈接中解釋問題。

您的問題的解決方案可能是為您的特定用例編寫自己的回調和匹配器,在那里您可以准確地知道要復制(克隆)的內容。

有時,如果您的單元測試難以正確,它會告訴您代碼需要更多單元,並且可能有一些方法有太多的責任。 看起來myCode正在做一些不同的事情:將callback應用到某個數組,然后修改該數組。 也許修改數組的代碼可以提取到myCode調用的自己的方法中。 然后你可以簡單地在單元測試中刪除那個額外的方法,以確保使用正確的參數調用回調。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM