나는 당신의 prog의 각 단계에 대한 시나리오를 생각해 내기 시작할 것입니다. 램, 실패 사례와 자신의 예상 행동을 시작 :
사용자가 널 csv 파일의 위치를 제공하는 것은 (AN ArgumentNullException
를 throw).
사용자가 빈 csv 파일 위치를 제공합니다 (ArgumentException
을 던짐).
사용자가 지정한 csv 파일이 존재하지 않습니다 (적절하다고 생각되는 모든 것).
그런 다음 각 시나리오에 대한 테스트를 작성하여 실패하는지 확인하십시오. 다음으로, 테스트 통과를위한 충분한 코드를 작성하십시오. 그 후
public class Merger {
public void Merge(string csvPath, string templatePath, string outputPath) {
if (csvPath == null) { throw new ArgumentNullException("csvPath"); }
}
}
표준 시나리오로 이동 :
이
지정된 CSV 파일이 테스트 통과를 만드는 코드가 종종 최종 코드이기 때문에 즉, 이러한 조건 중 일부에 대한 아주 쉽게 한 줄 (병합은 한 번 호출되어야하며, 출력은 예상 된 위치에 기록되어야 함).
지정된 csv 파일에는 두 줄이 있습니다 (병합을 두 번 호출해야하며 예상 된 위치에 출력됩니다).
출력 파일의 이름은 사용자의 기대치에 따라 달라집니다.
등등. 이 두 번째 단계가되면 스텁하고 조롱하려는 동작을 식별하기 시작합니다. 예를 들어, 파일이 존재하는지 여부를 확인합니다. .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