2014-02-20 3 views
4

Moq은 기본적으로 재귀 모의를하지 않습니다. 즉 모의에 대한 기대가없는 회원의 경우 Moq는 기본값을 반환합니다. 예를 들어, 주어진 :AutoFixture.AutoMoq가 기본적으로 재귀 모의를 만드는 이유는 무엇입니까?

public interface IFoo 
{ 
    Bar Bar(); 
} 

다음

public class Bar 
{ 
} 

을 :

[TestMethod] 
public void RecursiveMocksAreDisabledByDefaultInMoq() 
{ 
    var foo = new Mock<IFoo>().Object; 
    Assert.IsNull(foo.Bar()); 
} 

그러나 AutoFixture.AutoMoq에, 재귀 모의 객체는 기본적으로 활성화와 같이됩니다

[TestMethod] 
public void RecursiveMocksAreEnabledByDefaultInAutoFixture() 
{ 
    var fixture = new Fixture().Customize(new AutoMoqCustomization()); 
    var foo = fixture.Create<IFoo>(); 
    Assert.IsNotNull(foo.Bar()); 
} 

왜 그럴까요? AutoFixture.AutoMoq에서 자동 재귀 모크를 해제하는 방법은 무엇입니까?

감사

 
Moq.3.1.416.3 
AutoFixture.AutoMoq.3.16.5 
+1

AutoFoq (https://foq.codeplex.com/discussions/470568)의 ​​기본 반환 값과 관련된이 요소가 유용 할 수 있습니다. AutoFoq은 Foq 동작을 변경하지 않으므로 ('null' 'OOTB 메소드의 값을 반환). 나는 또한 AutoFoq과 Foq을 강력히 추천한다 - 그러나 나는 당신이 '그냥해라'는 것을 조롱하는 라이브러리를 바꾸는 것에 감사한다. 나는 가장 긴 시간 동안 개인적으로 모의 라이브러리가 어떻게 Moq보다 훨씬 더 유용 할 수 있고 그것을 알고 있음에도 불구하고 오랫동안 그것을 할인 할 수 있는지 이해하지 못했습니다. (NB 필자는 대부분의 테스트를 F #로 작성합니다.) –

+3

"AutoFixture는 독창적 인 라이브러리이며, 보유하고있는 의견 중 하나는 null이 유효하지 않은 반환 값입니다." http://stackoverflow.com/a/18170070/126014 –

+1

https://autofixture.codeplex.com/workitem/4261 –

답변

1

질문에 대한 의견이 이유의 원래의 질문에 대답한다고,하지만 후속 코멘트가있다 :

그것은하지만, 좋은 것, 재귀 모의 (recursive mock)를 사용하지 않는 쉬운 방법이 있습니다.

해당하지 않습니다.입니다. AutoMoqCustomization의 구현을 보면, 재귀 모의를 켜는 것은 use of MockPostProcessor입니다.

public class AutoNonRecursiveMoqCustomization : ICustomization 
{ 
    public void Customize(IFixture fixture) 
    { 
     if (fixture == null) 
      throw new ArgumentNullException("fixture"); 

     fixture.Customizations.Add(
      new MethodInvoker(
       new MockConstructorQuery())); 
     fixture.ResidueCollectors.Add(new MockRelay()); 
    } 
} 

MockPostprocessortrueCallBase을 설정

MockPostprocessor를 생략하여도 CallBase 해당 설정을 사용하지 않도록 : 당신이 원하지 않는 경우, 당신은 그렇게하지 않는 자신 만의 정의를 만들 수 있습니다.

관련 문제