2015-10-21 5 views
4

Хорошо, как было указано в моих other question, AutoMoq не использует AutoFixture по умолчанию. Это прекрасно и легко решить, выполнив настройку и настройку ReturnsUsingFixture.Настройка AutoMock с помощью систем данных AutoFixture

Но может ли это быть настроено с помощью автоматических систем данных Fixture?

Итак, у нас есть пользовательский атрибут AutoDataAttribute, который я назову [MyAutoData]. И там мы вызываем и настраиваем набор настроек, таких как AutoConfiguredMoqCustomization, настраиваем его для создания контроллеров webapi и регистрируем множество пользовательских генераторов. Таким образом, мы смогли вытащить ПОЛНОСТЬЮ всю конфигурацию шаблона в некоторые базовые файлы конфигурации. Мы даже установили атрибут MyAutoData для системных тестов, поэтому, если вы попросите, скажем, Id<Account>, он пойдет и создаст новую учетную запись, используя фактические вызовы webapi и вернет действительный идентификатор учетной записи.

Но как вы можете справиться с этим для настройки AutoMoq метод возвращает? Вот пример:

[Theory, MyAutoData] 
    public async Task Test(Mock<ICqrsService> mockService, TheRequest request) 
    { 
     mockService.Setup(service => service.CreateAsync<TheRequest>(It.IsAny<TheRequest>(), It.IsAny<CancellationToken>())) 
     .ReturnsAsync(result); // or similar car with ReturnUsingFixture 
     /* now we can test */ 
    } 

В любом другом случае, мы были в состоянии переместить этот вид конфигурации в MyAutoData (или в классе она называет). Но для AutoMoq я не вижу, как это должно работать. Мы не можем сделать светильник.

Есть ли способ инициировать метод установки после того, как AutoFixture генерирует элемент, но до его доставки к методу тестирования? Или есть способ настроить поведение AutoMoq, чтобы ВСЕГДА использовать .ReturnsUsingFixture(fixture)? Или я просто думаю об этой проблеме, все неправильно?

ответ

3

Метод IPostprocessComposer<T>.Do(Action<T>) позволяет дополнительно настроить образец после.

В вашем случае, вы можете использовать его в качестве настройки для установки в общий метод на двойной тест, чтобы вернуть объект, созданный AutoFixture:

public class FakeServiceCustomization : ICustomization 
{ 
    public void Customize(IFixture fixture) 
    { 
     fixture.Customize<Mock<IService>>(composer => 
      composer.Do(fake => 
       fake.Setup(service => service.Create<Something>()) 
        .ReturnsUsingFixture(fixture); 
    } 
} 
+0

Это решило его, спасибо. – Riplikash

3

FWIW, я уже думаю, что AutoConfiguredMoqCustomization слишком неявный для моих вкусов. AutoFixture, однако, является проектом сообщества, и другие люди считают его полезным для его реализации.

Я не думаю, что есть какая-то причина, по которой по дизайнуAutoConfiguredMoqCustomization не устанавливает общие методы; Я думаю, что простая причина в том, что трудно сделать. Другими словами, дело не в том, что AutoFixture не будет сделайте это для вас, а скорее, что он не может.


Все, что сказал, в духе GOOS, я думаю, вы должны слушать ваши тесты. Если тесты трудно записать, это обычно означает, что SUT сложно использовать. Это должно сначала вызвать размышление о SUT, а не тесты.

Не могли бы вы спроектировать SUT, чтобы у вас не было это функция AutoFixture?