1

나는 Ninject.Moq 다음과 같은 코드를 실행하려고 해요 :Ninject.Moq에서 다음과 같은 조롱이 작동하지 않는 이유는 무엇입니까?

[TestMethod] 
public void TestMethod1() 
{ 
    var kernel = new MockingKernel(); 
    var engine = kernel.Get<ABC>(); 

    //as I don't need to actually use the interfaces, I don't want 
    //to even have to bother about them. 

    Assert.AreEqual<string>("abc", engine.ToString()); 
} 

을 그리고 여기에 ABC 클래스 정의입니다 :

public class ABC { 
    IA a; 
    IB b; 

    public ABC(IA a, IB b) 
    { 
     this.a = board; 
     this.b = war; 
    } 

    public override string ToString() 
    { 
     return "abc"; 
    } 
} 

나는 다음과 같은 예외가 받고 있어요 :

System.ArgumentException : 일치하는 주어진 인수에 대한 생성자가 조롱 된 형식에서 찾을 수 없습니다. ---> System.MissingMethodException : 생성자 유형이 'AbcProxya759aacd0ed049f3849aaa75e2a7bade' 을 찾을 수 없습니다.

답변

3

좋아,이 코드를 작동하게됩니다

[TestMethod] 
public void TestMethod1() 
{ 
    var kernel = new MockingKernel(); 
    kernel.Bind<Abc>().ToSelf(); 
    var engine = kernel.Get<ABC>(); 

    //as I don't need to actually use the interfaces, I don't want 
    //to even have to bother about them. 

    Assert.AreEqual<string>("abc", engine.ToString()); 
} 

하나는 자체 Abc 바인딩, 그렇지 않으면 그것은 또한 조롱 얻을 것이다 가지고 있으며, MOQ는 경우가 아니라있는 조롱 매개 변수가 클래스를 지원합니다.

2

작은 조각이 실제로는 전체 점을 얻지 못합니다 : understanding DI in the first place과 같습니다.

Ninject.Moq (또는 AutoFixture과 같은 유사한 테스트 인프라 라이브러리)와 같은 자동차 고정 컨테이너는 간단한 예를 들어 설명하기가 어렵습니다. 나는이 요구 사항을 느끼는 방법으로 all of Mark Seemann's posts on AutoFixture을 읽는 것이 좋습니다.

그래서 Ninject.Moq은 체인을 다루는 것, 일을 수행하는 과정에서 테스트 대상 시스템을 충족하는 데 필요한 인터페이스의 스텁 구현 한 세트의N 수준 깊은 테스트가 실제로 있어야하는데 테스트.

일반적으로 덮개 아래에있는 조명기의 복잡도와 상호 작용을 최소화하면서 쉽게 읽을 수 있고 쉽게 바닥 글을 테스트 할 수 있습니다 (기본 클래스의 큰 계층 구조가 없거나 엉뚱한 분해 및 호출 기본 클래스를 수행하는 6 가지 마법 메서드). 일반적으로이 목표는 단위 테스트에서 DI 툴리 거리를 멀리 유지해야 함을 의미합니다.

automocking container는 전기 톱과 마찬가지로 투자를 위해 상당한 실제 수익 (많은 개가 더 짧고 이해하기 쉬운 테스트)을 얻을 수있는 곳에서만 사용해야합니다 (다른 사람이 읽을 수 있기 전에 이해할 수있는 다른 도구 더 많은 디버깅, 더 많은 놀라움, 더 많은 복잡성으로 인해 부서지기 쉽고 유지가 불가능한 테스트를 수행 할 수 있습니다.

+0

설명해 주셔서 감사합니다. 하지만 주어진 예를 들어 본다면 내가 잘못한 일을하고 있는지 알 수 있습니까? –

+1

@devoured elysium : 당신이 위와 같이 automocking container가 사용을 허용해야한다는 것이 나의 믿음이다. AutoFixture는 확실히 그것을 가능하게합니다 (내가 사용하는 것). 솔직히 말해서, 귀하의 질문은 혼란 스럽거나 귀하를 위해 일하지 않는 부분 (또는 귀하의 상황을 설명하는 부분)에 대해 혼란 스럽습니다. ... 따라서 일반적인 응답 ... 아마도 당신은 조금 질문을 확장 할 수 있고, 나는 그것에 대답하거나 그것에 현상금을 붙일 것입니다. 그리고 누군가는 Ninject의 구체적인 예와 함께 깜박일 것입니다. 당신이 찾고있는 무엇) –

+0

나는 나의 문제가 현재 인 무슨에 관하여 더 명백하기 위하여 본래 포스트를 편집했다. 그동안 Ninject의 그룹에도 동일한 질문을 게시했습니다. 거기에 대답이 있으면 여기에 게시 할 것입니다. –