한 가지 방법은 내가 원하는 단지 시설을 포함하는 파일 시스템의 추상화를 만드는 것입니다. 이 예제에서는 Git 로그 기록에서 정보를 추출하는 유틸리티를 작성했습니다. 가상화 할 수 있도록 모든 메소드를 가상으로 만들었지 만 인터페이스를 쉽게 정의 할 수 있습니다.
class SomeClassThatNeedsTheFileSystem
{
public SomeClassThatNeedsTheFileSystem(FileSystemService filesystem = null)
{
fileSystem = filesystem ?? new FileSystemService();
}
}
참고 :이 오히려 작은 프로젝트와 내가이 IOC의에 참여하고 싶지 않았다
/// <summary>
/// Class FileSystemService - an abstraction over file system services.
/// This class consists mainly of virtual methods and exists primarily to aid testability.
/// </summary>
public class FileSystemService
{
public virtual bool DirectoryExists(string path)
{
return Directory.Exists(path);
}
public virtual string PathCombine(string path1, string path2)
{
return Path.Combine(path1, path2);
}
public virtual string GetFullPath(string path)
{
return Path.GetFullPath(path);
}
public virtual void SaveImage(string path, Bitmap image, ImageFormat format)
{
image.Save(path, ImageFormat.Png);
}
}
지금처럼 필요가있는 객체에 주입, 파일 시스템 서비스를 만든 데 컨테이너를 만들었으므로 FileSystemService를 기본값 인 'null'이있는 선택적 매개 변수로 만들어 "poor man 's IoC"를 수행했습니다. 그런 다음 null을 테스트하고 생성자 내에서 FileSystemService를 새로 작성합니다. 이상적으로,보다 견고한 코드의 경우 필자는 매개 변수를 필수로 설정하고 호출자가 FileSystemService를 전달하도록합니다. 이 가짜를 만드는 데 시간이 올 때
, 나는 (내가 MSpec 및 FakeItEasy를 사용하고) 이런 식으로 작업을 수행합니다
// Some stuff elided for clarity
public class with_fake_filesystem_service
{
Establish context =() =>
{
Filesystem = A.Fake<FileSystemService>();
};
protected static FileSystemService Filesystem;
}