簡體   English   中英

在dart中存根類的任何實例

[英]Stub any instance of a class in dart

用紅寶石進行開發可以做以下事情:

File.any_instance.expects(:delete)

這是在方法調用中測試副作用的好方法。

如何做飛鏢等效物?

例如,如果您擁有dart:

class Storage {
  // the function to test
  void deleteFile(String path) {
    var fileToDelete = new File(path);
    if (await fileToDelete.exists()) {
      await fileToDelete.delete();
    }
  }
}
...
test("#deleteFile delete the file exists", () {
  storage = new Storage();
  // something equivalent to "File.any_instance.expects(:delete).once"
  storage.deleteFile("/existing.txt")
});

test("#deleteFile does not try to delete the file when it does not exists", () {
  storage = new Storage();
  // something equivalent to "File.any_instance.expects(:delete).never"
  storage.deleteFile("/not_existing.txt")
});

您將如何編寫代碼來檢測是否已使用正確的參數調用File的實例?


存在一些使此可測試的模式,如此處所述: https : //github.com/mockito/mockito/wiki/Mocking-Object-Creation

但是,這兩種模式都需要修改該類,以便使其更具可測試性,方法是在實例化Storage類時,在其自己的方法中隔離File對象的創建,然后對該方法進行存根,或者使用工廠來推斷該模擬。

我想找到一種方法來執行此操作,而不必修改類以使其像在ruby中一樣更具可測試性。


這對於檢查在方法執行期間是否生成了一些日志也可能非常有用。

在Dart中,沒有通用的方法來攔截靜態方法調用(包括構造函數)或實例成員。

您可以知道何時調用某個方法的唯一方法是,在將對象引用傳遞給調用方之前,是否可以包裝調用該方法的對象。 因為Dart允許實現任何類接口,所以只要您可以在對象的創建者和用戶之間找到對象,就可以包裝任何已知的對象(如果您是創建者,則可以創建模擬而不是曾經有一個真實的對象)。 該方法仍然無法用於靜態方法。

也就是說,您需要一些抽象層,在其中可以替換代碼而不是默認行為。

當前問題的措辭方式無法解決。 您不能更改由File構造函數創建的對象,也不能更改調用其delete方法時發生的情況。 沒有鈎子允許這樣做。 您需要以某種方式重寫Storage類,以引入使您能夠在類與File對象之間進行抽象的抽象,也許采用它使用的File createFile(String path)函數代替new File

您可以使用https://pub.dartlang.org/packages/mockito來構建模擬或實現自己的模擬,例如

class StorageMock extends Mock implements Storage {
  void delete(String path) {
    ..
  }
 }

暫無
暫無

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

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