나는 유닛 닷넷 System.IO 클래스에 대한 호출을 조롱 테스트 가능한 코드를 생성 할, 그래서 난 정말 단위 테스트 대신 파일 시스템에 따라 할 수 있습니다. SystemWrapper 클래스를 사용하여 BCL 클래스를 랩핑합니다. .Net IO 클래스를 사용하여 테스트 가능한 코드를 만드는 방법은 무엇입니까?
나는 파일이 존재하는지 확인하기 위해 노력하고 간단한 예제를 얻기 위해 노력하고 있어요.내가 겪고있는 문제는 종속성을 인스턴스화 (StructureMap 통해) 때문에 전달할 수있는 생성자 매개 변수를 알고 있어야하며, 그 시간에 사용할 수 없게됩니다. 기본 생성자가 없습니다.
샘플 코드 :
// don't want to create dependency here like so
//IFileInfoWrap fileInfoWrap = new FileInfoWrap(filename);
// using service locator (anti-pattern?!) since it can't be
// injected in this class
var fileInfoWrap = ObjectFactory.GetInstance<IFileInfoWrap>(
new ExplicitArguments(new Dictionary<string, object>
{
{"fileName", filename}
}));
Console.WriteLine("File exists? {0}", fileInfoWrap.Exists);
내가 좋아하지 않는 것은 종속성이 주입되지 않는 것입니다, ObjectFactory를 여기 안 (하지만이를 만드는 다른 방법을 참조). ExplicitArguments가 지저분하고 argument-name이 마술 문자열입니다.
ObjectFactory.Initialize(x =>
{
x.Scan(scan =>
{
scan.AssembliesFromPath(".");
scan.RegisterConcreteTypesAgainstTheFirstInterface();
scan.WithDefaultConventions();
});
// use the correct constructor (string instead of FileInfo)
x.SelectConstructor(() => new FileInfoWrap(null as string));
// setting the value of the constructor
x.For<IFileInfoWrap>()
.Use<FileInfoWrap>()
.Ctor<string>("fileName")
.Is(@".");
});
: 날이 StructureMap의 설정 클래스를 작동하도록하기 위해
는
나는 (내가 너무이 그것을 설정하는 올바른 방법으로하지 않을 수 StructureMap 시작) 사용할 EXPLICT하는 생성자 알 필요가있다
누구나 System.IO 클래스에 대해 테스트 할 수있는 코드를 만드는 더 좋은 솔루션을 찾았습니까? 문제의 일부가 System.IO 클래스의 디자인에 있음을 알고 있습니다.
는
SystemWrapper 대부분 매우 새는 추상화가 포함되어 있습니다. Streams, TextWriter, TextReader 등에 대해 IO를 모델링하는 것이 훨씬 쉽고 쉬울 것입니다.이 클래스들은 이미 추상적이어서 SystemWrapper의 필요성을 완전히 제거합니다. 스트림 –
또 다른 투표가 있기 때문에 원래의 클래스가 작동하는 방식하지만, 인터페이스와 멋진 래퍼로는 여전히 막 다른 골목을 보인다이다. 예를 들어 FileInfo 객체의 배열을 반환하면 올바르게 조롱 될 수 없습니다. 기존 클래스를 모방하지 않아도되는 좀 더 단순화 된 래퍼를 롤링하면서 더 많은 작업을 수행하면 IMHO라는 실행 가능한 솔루션으로 이어집니다. –
SystemWrapper 나의 연구 결과에 대한 –