[英]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.