Как: Заказано GUI тестов для проекта MVVM (MSTest / NUnit) - PullRequest
0 голосов
/ 14 февраля 2020

В моем приложении пользователь может создавать новые методы и редактировать их. Я создал тестовый модуль MSTest для проверки правильности поведения MethodViewModel.

Текущий тест выглядит следующим образом:

[TestMethod]
public void Create_new_method_edit_and_apply()
{
  var methodViewModel = new MethodViewModel();

  // Initial state: Command 'New' can be executed
  Assert.IsTrue(methodViewModel.CmdNew.CanExecute(null));

  // Initial state: Command 'Ok' can *not* be executed
  Assert.IsFalse(methodViewModel.CmdOk.CanExecute(null));

  // Initial state: There is no current method
  Assert.IsNull(methodViewModel.CurrentMethod);

  // Invoke the 'New' command to start creating a new method
  methodViewModel.CmdNew.Execute(null);

  // 'Create new method' state: New command can *not* be executed
  Assert.IsFalse(methodViewModel.CmdNew.CanExecute(null));

  // 'Create new method' state: Ok command *still can't* be executed
  Assert.IsFalse(methodViewModel.CmdOk.CanExecute(null));

  // 'Create new method' state: setting the user input of method name
  methodViewModel.UserInputMethodName = "My new method";

  // 'Create new method' state: Ok command *now can* be executed
  Assert.IsTrue(methodViewModel.CmdOk.CanExecute(null));

  // Invoke the 'Ok' command to finish creating a new method
  methodViewModel.CmdOk.Execute(null);

  // 'New method created' state: Command 'New' can be executed
  Assert.IsTrue(methodViewModel.CmdNew.CanExecute(null));

  // 'New method created' state: Command 'Ok' can *not* be executed
  Assert.IsFalse(methodViewModel.CmdOk.CanExecute(null));

  // 'New method created' state: Now *there is a* current method
  Assert.IsNotNull(methodViewModel.CurrentMethod);

  // 'New method created' state: And also a working copy
  Assert.IsNotNull(methodViewModel.CurrentMethodWorkingCopy);

  // 'New method created' state: Checking some current values
  Assert.AreEqual(methodViewModel.CurrentMethod.Name, "My new method");
  Assert.AreEqual(methodViewModel.CurrentMethod.LinearTableSpeed, 0);
  Assert.AreEqual(methodViewModel.CurrentMethodWorkingCopy.LinearTableSpeed, 0);

  // Commands 'Apply' and 'Reject' *can not* be executed
  Assert.IsFalse(methodViewModel.CmdApply.CanExecute(null));
  Assert.IsFalse(methodViewModel.CmdReject.CanExecute(null));

  // 'Editing method' state: Changing a value. NOTE: This is done in
  // the working copy 
  methodViewModel.CurrentMethodWorkingCopy.LinearTableSpeed = 3;

  // Verifying it
  Assert.AreEqual(methodViewModel.CurrentMethod.LinearTableSpeed, 0);
  Assert.AreEqual(methodViewModel.CurrentMethodWorkingCopy.LinearTableSpeed, 3);

  // Now commands 'Apply' and 'Reject' *can* be executed
  Assert.IsTrue(methodViewModel.CmdApply.CanExecute(null));
  Assert.IsTrue(methodViewModel.CmdReject.CanExecute(null));

  // Invoke the 'Apply' command to apply the changes
  methodViewModel.CmdApply.Execute(null);

  // Verify that CurrentMethod now has the changed value (as the
  // working copy already had).
  Assert.AreEqual(methodViewModel.CurrentMethod.LinearTableSpeed, 3);
  Assert.AreEqual(methodViewModel.CurrentMethodWorkingCopy.LinearTableSpeed, 3);

  // Now add another method
  methodViewModel.CmdNew.Execute(null);
  methodViewModel.UserInputMethodName = "2nd method";
  methodViewModel.CmdOk.Execute(null);

  // Checking some current values of new method
  Assert.AreEqual(methodViewModel.CurrentMethod.Name, "2nd method");
  Assert.AreEqual(methodViewModel.CurrentMethod.LinearTableSpeed, 0);
  Assert.AreEqual(methodViewModel.CurrentMethodWorkingCopy.LinearTableSpeed, 0);

  // Now select the first method again
  methodViewModel.MethodsView.MoveCurrentToFirst();

  // Checking if the firtly created method has still the expected values
  Assert.AreEqual(methodViewModel.CurrentMethod.Name, "My new method");
  Assert.AreEqual(methodViewModel.CurrentMethod.LinearTableSpeed, 3);
  Assert.AreEqual(methodViewModel.CurrentMethodWorkingCopy.LinearTableSpeed, 3);
}

Теперь это немного большая функциональность в одном методе тестирования, который я ' хотелось бы отделиться, например

MethodViewModel methodViewModel;

[TestMethod]
public void Create_new_method()
{
  methodViewModel = new MethodViewModel();
  ...
}


[TestMethod]
public void Edit_newly_created_method()
{
  Assert.IsNotNull(methodViewModel);
  ...
}

[TestMethod]
public void Create_another_method()
{
  Assert.IsNotNull(methodViewModel);
  ...
}

[TestMethod]
public void Switch_back_to_first_method_and_verify()
{
  Assert.IsNotNull(methodViewModel);
  ...
}

Но тогда эти методы должны выполняться в правильном порядке (здесь: так как они перечислены сверху вниз). И первый должен создать MethodViewModel.

Однако везде, где я читаю, неизолированные, зависимые тесты - плохая вещь.

Итак, мой вопрос, правда ли это?

А если нет, каков наилучший способ выполнить заказанный тест? Я полагаю, что лучше изменить структуру теста на NUnit?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...