Мок-объект, внедренный через AutoFixture с AutoMoq, неожиданное поведение

Я только что создал свой первый тест с помощью AutoFixture. SUT имеет следующий конструктор.

public LoggingService(
    IClientDataProvider clientDataProvider, ... other dependencies...)

Тестовая установка имеет следующий код.

var fixture = new Fixture().Customize(new AutoMoqCustomization());

string ipAddress = "whatever";// fixture.CreateAnonymous<string>();

var clientDataProviderMock = fixture.Freeze<Mock<IClientDataProvider>>();
clientDataProviderMock.Setup(cdp => cdp.IpAddress).Returns(ipAddress);

LoggingService sut = fixture.CreateAnonymous<LoggingService>();

Теперь, когда я изучаю содержимое sut, я вижу, что свойство IpAddress внедренного экземпляра IClientDataProvider возвращает значение null вместо «независимо».

Что я сделал не так?


Я скопировал сервис и необходимые интерфейсы в пустой проект, после чего моки заработали как положено.

Интерфейсы, которые являются типами аргументов конструктора службы в реальном проекте, определены в 3 отдельных сборках, которые имеют дополнительные зависимости. У меня было несколько неожиданных ошибок «Невозможно загрузить сборку» при запуске теста, потому что для тех сборок, на которые есть прямые ссылки, потребовалось несколько дополнительных сборок. Так что, похоже, проблема с загрузкой сборки.

Однако я попробовал вариант теста с ручным созданием экземпляра SUT с фиктивными объектами, созданными вручную с помощью Moq, и тест работал, как и ожидалось.


person Ivan Gerken    schedule 17.09.2012    source источник
comment
Ваш код выглядит нормально, и я не могу воспроизвести вашу проблему. Для меня IpAddress содержит что угодно... Можете ли вы попробовать это в пустом проекте? А что такое AuditHistoryLoggingService?   -  person nemesv    schedule 17.09.2012
comment
AuditHistoryLoggingService — читается как LoggingService, я просто пытался убрать лишние символы из исходного кода.   -  person Ivan Gerken    schedule 17.09.2012
comment
Свойство IpAddress (типа String) имеет правильное значение. Я добавил точку останова в конструкторе класса LogginService и проверил экземпляр IClientDataProvider. Можете ли вы скопировать и вставить свой класс LoggingService?   -  person Nikos Baxevanis    schedule 17.09.2012
comment
Поскольку вы, кажется, сталкиваетесь с проблемами загрузки сборки, может ли это быть проблемой? stackoverflow.com/questions/6505591/autofixture-and-moq-v4< /а>   -  person Mark Seemann    schedule 17.09.2012
comment
Марк, спасибо за предложение, но это что-то другое. Как я уже писал, фиктивные экземпляры зависимостей были созданы и внедрены в сервис, но это не те экземпляры, которые я настроил с помощью Freeze.   -  person Ivan Gerken    schedule 18.09.2012
comment
Можете предоставить репродукцию?   -  person Mark Seemann    schedule 18.09.2012


Ответы (1)


Решение было довольно неожиданным. Когда я создавал свой модульный тестовый проект, я сначала добавил ссылку на Moq 4.0. AutoFixture был добавлен позже, и, поскольку для него требуется Moq 3.1, я скопировал эту dll прямо в bin\Debug. Однако соответствующий элемент HintPath в файле проекта по-прежнему указывал на dll версии 4.0. Как только я изменил HintPath, чтобы он указывал на место, где находится Moq 3.1, тест начал работать правильно. Так что Марк был прав со своим предположением, но симптомы были совершенно другими.

person Ivan Gerken    schedule 18.09.2012