簡體   English   中英

如何匹配 Jasmine 中的 TypeScript 可選參數?

[英]How to match TypeScript optional parameter in Jasmine?

我正在重構 TypeScript 方法以添加具有默認值的可選參數。 重構方法是核心操作,調用核心函數的高級操作有很多。 預先存在的調用省略了新參數(因此使用默認值),而新的和重構的方法提供了新的參數值。 簡化版本如下所示:

export class Scratch {
  coreOperation(mainArg: string, option: boolean = false) {
    // ...
  }

  private midLevelOperation(mainArg: string) {
    this.coreOperation(mainArg + '1');
  }

  highLevelOperation1(mainArg: string) {
    this.midLevelOperation(mainArg);
    this.coreOperation(mainArg + '2', true);
  }
}

我還在更新更高級別操作的 Jasmine 測試。 我想斷言高級操作會導致使用某些參數調用核心操作。 測試大致如下所示:

describe('Scratch', () => {
  let objectUnderTest: Scratch;

  beforeEach(() => {
    objectUnderTest = new Scratch();
    spyOn(objectUnderTest, 'coreOperation');
  });

  describe('highLevelOperation1', () => {
    it('should call core operation', () => {
      objectUnderTest.highLevelOperation1('main');
      expect(objectUnderTest.coreOperation).toHaveBeenCalledWith('main1', false);
      expect(objectUnderTest.coreOperation).toHaveBeenCalledWith('main2', true);
    });
  });
});

問題是 Jasmine 的toHaveBeenCalledWith不知道第二個參數有默認值。 上述代碼的錯誤:

  - Expected spy coreOperation to have been called with:
    [ 'main1', false ]
  but actual calls were:
    [ 'main1' ],
    [ 'main2', true ].

顯然,我可以通過從測試中刪除false參數來通過測試。 但我不希望測試知道調用站點是使用 1 個參數還是 2 個參數,尤其是來自像這個示例這樣的私有庫函數。

有沒有辦法編寫一個在省略可選參數和傳遞默認值時都可以工作的 Jasmine 匹配器?

不幸的是,沒有辦法監視 Jasmine 中的默認/可選參數。

這是不可能的,有幾個原因:

  1. 默認參數設置在調用方法范圍內的arguments數組變量中,它們不是傳遞給參數的實際值。
  2. toHaveBeenCalledWith只能測試調用該方法的參數,而不是該方法決定將其缺少的參數默認為哪些值。

要解決此問題,您可以將目標方法包裝在另一個包含option: boolean = false默認參數。 然后您應該能夠檢查調用coreOperation的內容:

coreOperation(mainArg: string, option: boolean) {
  // ...
}

private coreOperationDefaultWrapper(mainArg: string, option: boolean = false) {
  this.coreOperationmainArg(mainArg, option);
}

值得注意的是,最好的測試是測試應用程序做了什么而不是測試它是如何編寫的。 因此,我強烈建議練習測試默認參數會導致什么行為的心態,而不是檢查它們實際上是什么。 當然這並不總是可能的,我希望上面的例子可以幫助你! :)

暫無
暫無

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

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