Тестирование этой команды
Я предполагаю, что я совсем новичок в модульных тестах, и у меня есть некоторые проблемы при проверке этой команды
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
,
Install-Package NSubstitute
Install-Package NUnit
Допустим, у вас есть класс, у которого есть метод, который требует Да, затем Нет:
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 и оживить тестовую реализацию.