0

Я использую TDD-подход с xUnit 2, NSubstitute, AutoFixture, FluentAssertions для моих модульных тестов.Единичные тесты с FluentValidation. Как mock ValidationResult

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

Простой пример:

Validator:

RuleSet("Nulls",() => 
     { 
      RuleFor(viewModel => viewModel).NotNull(); 
     }); 

Моя служба (тестируемый):

if(Validate(viewModel, "Nulls")) 
//.... 
private bool Validate(AddMerchantViewModel viewModel, string option) 
{ 
    var result = _merchantValidator.Validate(viewModel, ruleSet: options); 
    return result.IsValid; 
} 

И мой блок тест:

Я не знаю, как насмехаться с результатом merchantValidator.Validate.

[Theory, AutoNSubstituteData] 
public void Add_ViewModelAsNull_ShouldThrowArgumentNullException(
    AbstractValidator<AddMerchantViewModel> merchValidator, 
    MerchantsService service) 
{ 
    // Arrange 


    //here I don't know how to mock result of Validate. It is always null. 
    merchantValidator.Validate(Arg.Any<AddMerchantViewModel>(), ruleSet: Arg.Any<string>()).Return(new ValidationResult()); 



    // Act 
    Action action =() => service.Add(null); 

    // Assert 
    action.ShouldThrow<ArgumentNullException>(); 
} 

ответ

1

По умолчанию AutoFixture создает новый экземпляр типа каждый раз, когда он запрашивается. В этом конкретном случае тип AbstractValidator<AddMerchantViewModel> создается дважды - как параметр merchValidator и как зависимость класса MerchantsService.

В результате сконфигурированный валидатор не используется службой . Для того, чтобы исправить, что вы должны украсить параметр merchValidator с атрибутом [Frozen] так, что тот же экземпляр AbstractValidator<AddMerchantViewModel> типа всегда возвращается АФ:

[Theory, AutoNSubstituteData] 
public void Add_ViewModelAsNull_ShouldThrowArgumentNullException(
    [Frozen]AbstractValidator<AddMerchantViewModel> merchValidator, 
    MerchantsService service) 
// ... 

Больше информации Абот атрибута [Frozen] можно найти here.

Смежные вопросы