2016-12-21 15 views
1

콘솔에 현재 시간이 앞에 붙은 메시지를 쓰는 간단한 클래스가 있습니다. 그것은 Write 방법은 내가 xUnit의, AutoFixture 및 MOQ를 사용하여 다음 테스트를 작성했습니다 IDateTimeProvider.Now를 호출하는지 테스트하기 위해 DateTime.Now모의 된 인터페이스는 각 속성에 대해 두 개의 팬텀 호출을 얻습니다.

public interface IDateTimeProvider 
{ 
    DateTime Now { get; } 
    DateTime UtcNow { get; } 
} 

public class MessageWriter 
{ 
    private readonly IDateTimeProvider _dateTimeProvider; 

    public MessageWriter(IDateTimeProvider dateTimeProvider) 
    { 
     _dateTimeProvider = dateTimeProvider; 
    } 

    public void Write(string message) 
    { 
     Console.WriteLine($"{_dateTimeProvider.Now.ToShortTimeString()} : {message}"); 
    } 
} 

통해 추상화로 IDateTimeProvider 인터페이스에 대한 종속성이 있습니다

public class MessageWriterTests 
{ 
    [Theory, AutoMoqData] 
    public void Write_Always_CallsDateTimeProvider(
     [Frozen] Mock<IDateTimeProvider> dateTimeProviderMock, 
     MessageWriter sut, 
     string message) 
    { 
     sut.Write(message); 

     dateTimeProviderMock.Verify(m => m.Now, Times.Once()); 
    } 
} 
위의 http://blog.ploeh.dk/2010/10/08/AutoDataTheorieswithAutoFixture/

public class AutoMoqDataAttribute : AutoDataAttribute 
{ 
    public AutoMoqDataAttribute() 
     : base(new Fixture() 
      .Customize(new AutoMoqCustomization())) 
    { 
    } 
} 

테스트에서 볼 수 있듯이

나는 AutoMoqDataAttribute을 사용하고 있습니다 3 번 한 번 모의에

예상 호출을하지만했다 : 구성 m => m.Now

없음 설정을 다음과 같은 메시지와 함께 실패합니다.

Performed invocations: 
IDateTimeProvider.Now 
IDateTimeProvider.UtcNow 
IDateTimeProvider.Now 
IDateTimeProvider.UtcNow 
IDateTimeProvider.Now 
    at Moq.Mock.ThrowVerifyException(MethodCall expected, IEnumerable`1 setups, IEnumerable`1 actualCalls, Expression expression, Times times, Int32 callCount) 
    at Moq.Mock.VerifyCalls(Interceptor targetInterceptor, MethodCall expected, Expression expression, Times times) 
    at Moq.Mock.VerifyGet[T,TProperty](Mock`1 mock, Expression`1 expression, Times times, String failMessage) 
    at Moq.Mock.Verify[T,TResult](Mock`1 mock, Expression`1 expression, Times times, String failMessage) 
    at Moq.Mock`1.Verify[TResult](Expression`1 expression, Times times) 
    at MoqBug.Tests.MessageWriterTests.Write_Always_CallsDateTimeProvider(Mock`1 dateTimeProviderMock, MessageWriter sut, String message) in c:\Users\rik van der sanden\documents\visual studio 2015\Projects\MoqBug\MoqBug.Tests\MessageWriterTests.cs:line 21 

그래서 내 질문은 : 어디에서 오는 (인터페이스의 각 속성에 대해 2 개) 추가 호출을합니까?

나는 AutoMoqDataAttribute 문제를 사용하여 포기하는 경우

멀리 간다 : 시험의

[Theory, AutoData] 
    public void Write_Always_CallsDateTimeProvider(
     string message) 
    { 
     IFixture fixture = new Fixture().Customize(new AutoMoqCustomization()); 
     Mock<IDateTimeProvider> dateTimeProviderMock = fixture.Freeze<Mock<IDateTimeProvider>>(); 
     MessageWriter sut = fixture.Create<MessageWriter>(); 

     sut.Write(message); 

     dateTimeProviderMock.Verify(m => m.Now, Times.Once()); 
    } 

이 버전은 통과,하지만 난 오히려 매개 변수를 사용하여 그것을 할 것입니다.

답변

1

밝혀졌습니다. Moq의 버전 4.1.1308.2120을 사용 중이며, 현재 AutoFixture.AutoMoq에 의해 요구되는 가장 낮은 버전이므로 Nuget이 설치 한 버전입니다.

Moq을 최신 버전 (이 경우 4.5.28)으로 업데이트하면 문제가 해결되었습니다.