mardi 23 février 2021

.net core xunit How verify if method was called from inherited class

I have a base class called BaseService, and i want to verify if method IsValid was called in my unit test.

public interface IBaseService
{
    bool IsValid<Dto, DtoValidator>(Dto entityDto, DtoValidator validator) where DtoValidator : AbstractValidator<Dto>;
}

public class BaseService : IBaseService
{
    protected readonly IMapper _mapper;
    protected readonly INotificationService _notification;

    public BaseService(
        IMapper mapper,
        INotificationService notification)
    {
        _mapper = mapper;
        _notification = notification;
    }

    public bool IsValid<Dto, DtoValidator>(Dto entityDto, DtoValidator validator) where DtoValidator : AbstractValidator<Dto>
    {
        var result = validator.Validate(entityDto);
        foreach (var error in result.Errors)
        {
            _notification.Notify(error.ErrorMessage);
        }
        return result.IsValid;
    }
}

Class that use BaseService , some parts of code was omited

public interface IAfiliadoService : IBaseService {}

public class AfiliadoService : BaseService, IAfiliadoService
{
    public AfiliadoService(
        IMapper mapper,
        INotificationService notification) : base(mapper, notification)
    {
        _afiliadoRepository = afiliadoRepository;
        _lojaRepository = lojaRepository;          
    }

    public async Task<AfiliadoResponseDto> AddAsync(AddAfiliadoRequestDto request)
    {
        if (IsValid(request, new AddAfiliadoRequestDtoValidator()))
        {
        }
    }
}

In my test project i created those classes

public class MockBaseService
{
    public readonly Mock<IMapper> _mapper;
    public readonly Mock<INotificationService> _notification;

    public MockBaseService()
    {
        _mapper = new Mock<IMapper>();
        _notification = new Mock<INotificationService>();
    }
}


public class AfiliadoServiceTest : MockBaseService
{       
    private readonly IAfiliadoService _afiliadoService;

    public AfiliadoServiceTest()
    {
        _afiliadoService = new AfiliadoService(
            _mapper.Object,
            _notification.Object);
    }

    [Fact]
    public async Task AdicionarUsuarioComEmailQueJaExisteDeveNotificar()
    {
        var request = new AddAfiliadoRequestDto();

        var result = await _afiliadoService.AddAsync(request);

        Assert.Null(result);

        _notification
            .Verify(v => v.Notify(It.IsAny<string>()), Times.Once);

        // Here i want verify if method IsValid was called Once, like the verification above
    }
}

I tried some things but with no success. Exemple with what i want.

var mock = new Mock<AfiliadoService>();
mock.Verify(v => v.IsValid(request, new AddAfiliadoRequestDtoValidator()), Times.Once);

I know this not work because i called AfiliadoService by itself and not by mock instace, and didnt setup the IsValid. But the question is how i do this with what i have. I whant some mock in MockBaseService that can be called to verify the method was called.

Im using .net core - 3.1 xunit - 2.4.1 Moq - 4.16.0

Aucun commentaire:

Enregistrer un commentaire