2012-04-27 4 views
2

이것은 사소한 것이지만 TDD를 처음 접했을 때 올바른 방법을 찾지 못했습니다..NET 3.5 올바르게 모의하는 방법

시작 프로세스의 일부로 지정된 폴더에서 주 메뉴 모음을 동적으로 채우는 DLL을 찾는 WinForms 응용 프로그램이 있다고 가정 해 보겠습니다.

이러한 DLL은 단순한 플러그인으로 인터페이스를 구현하며 모두 메뉴 항목으로 표시됩니다. 정말 간단합니다.

각 DLL을 Module이라고 부릅시다.

지금, 나는 "이봐, 스티브, 당신은이 Module 객체를 조롱 할거야.. 이제 IModule라는 인터페이스를 정의하고 Module 클래스를 구현하게 당신이 그들을하시기 바랍니다 조롱 수있는 그런 식으로하자"생각했다.

그래서, 내가 몇 줄기의 코드를 작성할 수, 특히 IModuleModule (I 똑바로 컴파일러의 지원없이 쓰고 있어요, 그래서 컴파일하지 않을 수 있습니다) :

<!-- language: c# --> 

public interface IModule { 
    string Id { get; } 
    string DisplayName { get; } 
} 

public class Module : IModule { 
    public string Id { get; } 
    public string DisplayName { get; } 
    public string Path { get; private set; } 

    public Module(FileInfo path) { 
     Path = path.FullName; 
    } 
} 

그리고, 우리가에있는 동안,의 실제 로딩을 할 것입니다 클래스를 구현하자 여기

public class ModuleLoader { 
    IEnumerable<DirectoryInfo> SearchPaths; 

    public ModuleLoader(IEnumerable<DirectoryInfo> searchPaths) { 
     SearchPaths = searchPaths; 
    } 

    public IEnumerable<IModule> LoadModules() { 
     var modules = SearchPaths 
      .Where(dir => dir.Exists) 
      .SelectMany(dir => dir.GetFiles("*.dll").Select(dll => new Module(dll))); 
     return modules; 
    } 

} 

문제를 온다 : LoadModules() 내가 문제-분산 수집 할 수있는 것을에서의-때문에 컴파일되지 않습니다. 다음과 같이

오류 메시지는 다음과 같습니다

암시입니다 System.Collections.Generic.IEnumerable <IModule>

에 유형 System.Collections.Generic.IEnumerable < 모듈 >을 변환 할 수 없습니다 this와 동일합니다.

이제는 나를 피하는 사소한 것이 있어야합니다. 내 지식을 최대한 활용하여 LoadModules()을 반환하면 IEnumerable<IModule>이 Good Thing ™의 자격을 얻습니다. 반환 유형을 IEnumerable<Module>으로 변경하면 코드가 컴파일되지만 단위 테스트만으로 문제가 이동합니다.

저는 약간 혼란스럽고 어쩌면 모든 것을 잘못하고 있습니다. (사과하는 경우).

그럼 어떻게할까요? Module을 어떻게 조롱 할 수 있습니까?

답변

2

당신은 그 응, 그거야 ... IEnumerable<IModule>var을 교체하고 (IModule) (new Module(dll))

+0

으로 new Module(dll) 교체 그래서해야합니까? 간단한 캐스트. 나는 정말 휴가가 필요해. 고마워, 데빈. 같은 인터페이스에 특정 인터페이스를 구현하는 클래스의 인스턴스를 캐스팅해야하는 정확한 이유는 여전히 다소 불투명합니다. 에릭 리 퍼트의 분산에 대한 게시물을 읽어야합니다. BTW,'var'을 대체하는 것은 정말로 필요하지 않습니다. 그렇다면 정말로 놀랄 것입니다. 다시 한번 감사드립니다. –

+0

나는 var가 정말로 필요하지 않다는 것을 안다. 그러나 명확한 것은 이것이다. 특히이 경우에는 전체 문제가 LINQ 쿼리가 예기치 않은 타입을 반환하고 있다는 것이었다.이와 같은 경우, 명확성은 버그를 발견하고 제거하는 데있어 가장 중요한 요소입니다. – DevinB

+0

박람회장, DevinB. 고맙습니다. 이제 나는 조롱 할 수있다 :) –