В моем приложении пользователь может создавать новые методы и редактировать их. Я создал тестовый модуль 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?