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

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

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.

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


person advapi    schedule 19.10.2015    source источник


Ответы (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));
    }
}
person Chui Tey    schedule 19.10.2015

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

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

person Geert van Horrik    schedule 19.10.2015
comment
Привет, Герт, как я уже писал вам, я новичок в модульном тестировании и во всем, что с ним связано (насмешки и т. Д.), В какой версии эта функция присутствовала? Спасибо - person advapi; 19.10.2015
comment
Несколько версий назад, не могу вспомнить. - person Geert van Horrik; 19.10.2015