Тестирование этой команды

Я предполагаю, что я совсем новичок в модульных тестах, и у меня есть некоторые проблемы при проверке этой команды

internal async Task OnDeleteTreasurerCommandExecute(TesorieraItemResult tesoriera)
    {
        try
        {
            if (await MessageService.ShowAsync("Confermare l'operazione?", string.Empty, MessageButton.YesNo, MessageImage.Question) == MessageResult.Yes)
            {
                await repository.DeleteTesorieraItemAsync(tesoriera.ID_ISTITUTO,tesoriera.ID_DIVISA,tesoriera.PROGRESSIVO);

                await MessageService.ShowInformationAsync("Operazione completata");

                if (SelectedInstitute != null)
                    await OnLoadDataCommandExecute();
            }
        }
        catch (Exception ex)
        {
            ErrorService.HandleError(GetType(), ex);
        }
    }

Я использую Catel в качестве фреймворка MVVM

как мне смоделировать ответы да / нет? Спасибо

2 ответа

Решение

Вам необходимо заменить MessageService классом, который может возвращать ответ да или нет. Вот пример использования NSubstitute,

  1. Install-Package NSubstitute

  2. Install-Package NUnit

  3. Допустим, у вас есть класс, у которого есть метод, который требует Да, затем Нет:

    public class AccountViewModel
    {
        readonly IMessageService _messageService;
        readonly ICustomerRepository _customerRepository;
    
        public AccountViewModel(IMessageService messageService, ICustomerRepository customerRepository)
        {
            _messageService = messageService;
            _customerRepository = customerRepository;
        }
    
        public async Task OnDeleteCustomer(Customer customer)
        {
            if (await MessageService.ShowAsync(
               "Confirm?", 
                string.Empty, 
                MessageButton.YesNo, 
                MessageImage.Question) == MessageResult.Yes)
            {
                _customerRepository.Delete(customer);
                await MessageService.ShowInformationAsync("Completed");
            }
        }
    }
    

Тогда ваш тестовый пример выглядит так:

public class TestAccountViewModel
{
    [TestCase]
    public class TestDeleteCustomer()
    {
        // arrange
        var messageService = Substitute.For<IMessageService>();
        messageService
            .ShowAsync(
                Arg.Any<string>(),
                Arg.Any<string>(),
                Arg.Any<MessageButton>(),
                Arg.Any<MessageImage>())
            .Returns(Task.FromResult(MessageResult.Yes);

        messageService
            .ShowInformationAsync(Arg.Any<string>())
            .Returns(Task.FromResult<object>(null));

        var customerRepository = Substitute.For<ICustomerRepository>();

        // act
        var sut = new AccountViewModel(messageService, customerRepository);
        var customer = new Customer();
        sut.OnDeleteCustomer(customer);

        // assert
        Assert.IsTrue(customerRepository.Received().DeleteCustomer(customer));
    }
}

В предыдущей версии Catel предоставил тестовую реализацию IMessageService, которая позволяла ставить в очередь ожидаемые результаты, чтобы вы могли проверить различные пути внутри команды.

Я только что заметил, что этот класс больше не доступен, но вы можете легко реализовать тестовую заглушку самостоятельно (используя насмешки и т. Д.) Или вы можете внести свой вклад в Catel и оживить тестовую реализацию.

Другие вопросы по тегам