테스트 가능성을 개선하기 위해 프로젝트를 리팩토링하려고하므로 추상 팩터 리를 도입하려고합니다.MEF 및 팩토리 패턴
내 응용 프로그램은 ICrawlers
을 사용하여 다른 출처의 데이터를 수집합니다. 이러한 ICrawler
은 타사 라이브러리를 사용하여 다양한 소스에 액세스합니다 (예 : 지저귀다.
예 : 내 TwitterCrawler는 TweetSharp을 사용하여 트위터 데이터에 액세스합니다.
첫 번째 버전은 TweetSharp 클라이언트를 강력하게 크롤러에 연결했습니다. 이제는 TweetSharp를 ITwitterClient
및 TweetSharpTwitterClient
구현으로 추상화했습니다.
다음 단계는 TweetSharpTwitterClient
을 생성하는 DefaultTwitterClientFactory
과 함께 ITwitterClientFactory
을 소개하는 것입니다. 공장을 MockTwitterClientFactory
으로 전환하여 MockTwitterClient
을 생성하여 테스트 결과를 전달할 수 있으므로 내 목표 (테스트 가능성)에 더 가까워 야합니다.
자, 이제 제게 말씀 드리겠습니다. 의존성 주입을 위해 MEF을 사용하고 있습니다. (하지만 저는 그것에 익숙하지 않습니다.) MEF 내 DefaultTwitterClientFactory
수출 자체 반면
public class TwitterCrawler : CrawlerBase, ICrawler
{
[Import]
public ITwitterClientFactory TwitterClientFactory {get; set;}
public override Process()
{
ITwitterClient twitterClient = TwitterClientFactory.MakeSingletonClient();
// do something with twitterClient
}
}
:이 지금까지 작동하는 동안 이제
[Export(typeof(ITwitterClient))]
public class DefaultTwitterClientFactory: ITwitterClientFactory
{
// implementation of ITwitterClientFactory
// provides methods to create instances of ITwitterClient implementations
}
, 내 질문은, 어떻게 공장을 전환하는 것입니다 무엇을 내가 뭘하면이 무엇입니까? 단위 테스트를 만들고 대신 MockClientFactory
을 어떻게 사용할 수 있습니까?
내 접근 방식이 전혀 좋지 않습니까? 사용되는 공장을 수동으로 설정하는 것이 더 나은가?
... new TwitterCrawler(mockedTwitterClientFactory)
또는
.... new TwitterCrawler(mockedTwitterClient)
같은 어딘가에 뭔가?
사실이 문제는 TwitterClient 외부에서 문제가 발생하지만 ITwitterClient를 구성하는 방법과 그 목적으로 사용할 팩토리를 결정해야합니다. 단지 Test Doubles에 직접 SUT 배선 -
은 내가
감사 표시. 이것은 정말로 지금 나에게 의미가 있습니다. DI가 사용 중인지 여부와 상관없이 테스트가 실행되어야하므로 SUT에서 테스트를 제거하는 것은 테스트 할 유닛에 초점을 맞추고 있습니다. 나는 그것을 얻었다! – Stefan