2

테스트 가능성을 개선하기 위해 프로젝트를 리팩토링하려고하므로 추상 팩터 리를 도입하려고합니다.MEF 및 팩토리 패턴

내 응용 프로그램은 ICrawlers을 사용하여 다른 출처의 데이터를 수집합니다. 이러한 ICrawler은 타사 라이브러리를 사용하여 다양한 소스에 액세스합니다 (예 : 지저귀다.

예 : 내 TwitterCrawler는 TweetSharp을 사용하여 트위터 데이터에 액세스합니다.

첫 번째 버전은 TweetSharp 클라이언트를 강력하게 크롤러에 연결했습니다. 이제는 TweetSharp를 ITwitterClientTweetSharpTwitterClient 구현으로 추상화했습니다.

다음 단계는 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 배선 -

은 내가

답변

3

당신 shouldn't need to use the composer/container in your unit tests은 (? ExportProvider) MEF의 메커니즘에 더 많은 다이빙을해야한다. 이 같은

뭔가 :이 건물은 의존성이 선택적임을 의미로

var sut = new TwitterCrawler(); 
sut.TwitterClientFactory = new FakeTwitterClientFactory(); 

그러나, 당신은 정말, 주입을 생성자에 속성 주입에서 리팩토링해야한다.

현재, DefaultTwitterClientFactory는 자체적으로 엑스포트하지 않으며 ITwitterClient를 내 보냅니다.

+0

감사 표시. 이것은 정말로 지금 나에게 의미가 있습니다. DI가 사용 중인지 여부와 상관없이 테스트가 실행되어야하므로 SUT에서 테스트를 제거하는 것은 테스트 할 유닛에 초점을 맞추고 있습니다. 나는 그것을 얻었다! – Stefan