콘솔에 현재 시간이 앞에 붙은 메시지를 쓰는 간단한 클래스가 있습니다. 그것은 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());
}
이 버전은 통과,하지만 난 오히려 매개 변수를 사용하여 그것을 할 것입니다.