Я работал над созданием некоторых модульных тестов для своих ViewModels в моем проекте. У меня действительно не было проблем, поскольку большинство из них были очень простыми, но столкнулся с проблемой, когда у меня появился новый (незавершенный) ViewModel внутри другого моего ViewModel.Что вы должны делать с вложенными ViewModels при модульном тестировании?
public class OrderViewModel : ViewModelBase
{
public OrderViewModel(IDataService dataService, int orderId)
{
\\ ...
Payments = new ObservableCollection<PaymentViewModel>();
}
public ObservableCollection<PaymentViewModel> Payments { get; private set; }
public OrderStatus Status { ... } //INPC
public void AddPayment()
{
var vm = new PaymentViewModel();
payments.Add(vm);
// TODO: Subscribe to PaymentViewModel.OnPropertyChanged so that
// if the payment is valid, we update the Status to ready.
}
}
Я хочу, чтобы создать модульный тест, так что если какой-либо из моих PaymentViewModel
«ы IsValid
изменения собственности и все из них правда, что Status
должны быть OrderStatus.Ready
. Я могу реализовать класс, но меня беспокоит то, что мой модульный тест сломается, если проблема в PaymentViewModel
.
Я не уверен, что это нормально или нет, но мне кажется, что мне не нужно беспокоиться о том, правильно ли работает PaymentViewModel
, для того чтобы мой модульный тест для OrderViewModel
был верным.
public void GivenPaymentIsValidChangesAndAllPaymentsAreValid_ThenStatusIsReady()
{
var vm = new OrderViewModel();
vm.AddPayment();
vm.AddPayment();
foreach (var payment in vm.Payments)
{
Assert.AreNotEqual(vm.Status, OrderStatus.Ready);
MakePaymentValid(payment);
}
// Now all payments should be valid, so the order status should be ready.
Assert.AreEqual(vm.Status, OrderStatus.Ready);
}
Проблема в том, как я пишу MakePaymentValid
таким образом, что я гарантирую, что поведение PaymentViewModel не будет отрицательно влиять на мое модульное тестирование? Потому что, если это так, то мой модульный тест завершится неудачно, поскольку другой фрагмент кода не работает, а не мой код. Или, если он не сработает, если PaymentViewModel
ошибочен? Я просто разорван тем, что не думаю, что мои тесты для OrderViewModel
не сработают, если у PaymentViewModel
есть ошибка.
Я понимаю, что всегда мог создать интерфейс, например, как я делаю с IDataService
, но мне кажется, что это немного лишний, чтобы каждый из ViewModel имел интерфейс и вводил в какой-то форме?
Если я правильно понял вас. Вы можете создать отдельный тест для PaymentViewModel, если есть что-то, что может потенциально прервать, связанное с свойством IsValid в PaymentViewModel, оставив его неповрежденным. С другой стороны, если IsValid - простой сеттер без какой-либо бизнес-логики, то вы бы тестировали ObservableCollection по существу, создав отдельный тест, который, кажется, избыточен. –