我開始時會考慮你編的每一步的場景RAM,失敗案例及其預期的行爲開始:
接下來,爲這些場景中的每一個寫一個測試,並確保它失敗。接下來,編寫足夠的代碼以使測試通過。這很容易讓其中的一些條件,因爲這使你的測試通過的代碼往往是最終代碼:
public class Merger {
public void Merge(string csvPath, string templatePath, string outputPath) {
if (csvPath == null) { throw new ArgumentNullException("csvPath"); }
}
}
之後,進入標準的情況:
依此類推。一旦你進入第二階段,你將開始識別你想要存根和模擬的行爲。例如,檢查一個文件是否存在 - .NET並不容易將它存根,所以你可能需要創建一個適配器接口和類,它可以讓你將程序從實際的文件系統中分離出來不要說實際的CSV文件和郵件合併模板)。還有其他的方法,但這種方法是相當標準:
public interface IFileFinder { bool FileExists(string path); }
// Concrete implementation to use in production
public class FileFinder: IFileFinder {
public bool FileExists(string path) { return File.Exists(path); }
}
public class Merger {
IFileFinder finder;
public Merger(IFileFinder finder) { this.finder = finder; }
}
在測試中,你會傳遞一個存根實現:
[Test]
[ExpectedException(typeof(FileNotFoundException))]
public void Fails_When_Csv_File_Does_Not_Exist() {
IFileFinder finder = mockery.NewMock<IFileFinder>();
Merger merger = new Merger(finder);
Stub.On(finder).Method("FileExists").Will(Return.Value(false));
merger.Merge("csvPath", "templatePath", "outputPath");
}
非常好的具體例子! – Davy8 2010-12-09 15:56:56