2010-06-30 6 views
2

Moq에서 조롱 된 개체의 메서드에 대한 기대치를 설정하려고합니다. 동시에, Ninject를 사용하여 호출자가 해당 인터페이스를 원할 때마다 커널이 내 모의 작업을 반환하도록합니다. 더 명확하게하기 위해 다음은 몇 가지 의사 코드입니다의존성 주입 및 모의 프레임 워크 .net

Class Car { 

    Void buildChassis() { 
     Engine = ObjectBuilder.get<Iengine>() 
     Engine.performCheckup() 
    } 
} 

buildChassis를 테스트 할 때 mocked Engine을 플러그인하고 싶습니다.

Mock<Iengine>().setup().etc.etc.etc 

그러나 Moq은 Ninject와는 잘 맞지 않습니다. 나는 이것을 할 수 없습니다. DI와 조롱을 통합하는 강력한 소프트웨어 패키지가 있는지 궁금합니다. 나는 ninject.moq 패키지가 제대로 작동하지 못하고 성숙한 것 같지도 않습니다.

답변

3

저는 Moq을 사용하고 있지만 Ninject와는 다른 IoC 컨테이너를 사용합니다. 조롱/격리 및 IoC 컨테이너 프레임 워크를 통합 할 필요성을 느끼지 못했습니다. 생성자 삽입을 사용하고 단위 테스트에서 mock 객체를 클래스에 전달하기 만하면됩니다. 프로덕션 코드 만 컨테이너를 사용합니다.

IMHO 진짜 문제는 Car가 ObjectBuilder에 대해 알고 있다는 것입니다. 컨테이너를 서비스 위치 지정자로 사용하는 대신 생성자 삽입을 사용하지 않는 이유는 무엇입니까? 그렇게하면 최상위 클래스 하나만 IoC 컨테이너에 대해 알 필요가 있습니다.

class Car 
{ 
    public Car(IEngine engine) 
    { 
     // May want a null check here 
     Engine = engine; 
    } 

    public IEngine Engine { get; private set; } 
} 

시험 차는 쉽습니다. 모의 IEngine을 생성자에게 전달하십시오.

엔진을 나중에 만들어야하는 경우 팩토리 인터페이스를 전달할 수 있습니다.

다른 IoC 프레임 워크로 변경하려면 하나 또는 두 개의 최상위 클래스 만 변경하면됩니다.

+0

이는 경우에 당신은 정말에만 예를 들어, 목록에 추가, 클래스의 새로운 인스턴스를 생성하는 것과 필요합니까. 이 경우 어떻게 테스트 할 것입니까? (나는이 필요가있다 ...) –

+0

@Andrei : IEngine 인스턴스를 생성하는 방법으로 IEngineFactory를 주입한다 (편도, 또한 위임자를 삽입 할 수있다). Moq가 팩토리를 모의 할 수 있다면 create 메소드의 반환 값을 설정하여 다른 모의 객체를 반환 할 수 있습니다. – TrueWill

+0

http://www.tavaresstudios.com/Blog/post/Unity-20-Automatic-Factories.aspx도 참조하십시오. Ninject에이 기능이 있는지 확실하지 않습니다. – TrueWill

0

+1 다른 답변 - 모든 것을 제대로 작동시키는 큰 마법 도구는 거의 정답이 아닙니다. 테스트에서 많은 설정을해야한다는 사실이 코드의 구조에 대해 알려주는지 여부를 고려하는 것이 중요합니다. 또한 테스트를 너무 많은 쓰레기와 묶고 싶지는 않습니다. 이상적으로는 한 번에 하나의 장치 만 추가하고 추가 한 종속성에 대해서는 매우 신중하게 생각하십시오. 테스트 환경 설정 (Arrange)이 진행되고 테스트에 특정되지 않는 일반적인 물건이로드되면 상호 의존성 및 우연의 일치가 진창으로 변하는 자석이 될 것입니다. 궁극적으로 프로덕션 코드의 측면을 조정할 때마다 테스트 코드에서 스택을 다시 정렬해야합니다.

그러나 잘 http://github.com/ninject/ninject.moq