MSTest (Microsoft Test) позволяет тестировать различные элементы программного обеспечения, например, функции и классы. Данный фреймворк будет полезен вам для быстрого тестирования ваших проектов.
/// <summary> /// Проверка корректности работы свойств раздела. /// </summary> [TestMethod] public void GetSectionProperties_FromCorrectSection_ShouldGetCorrectProperties() { var section = new Section(_defaultName, _defaultCode, _defaultName); Assert.IsTrue(section.Name == _defaultName && section.Code == _defaultCode && section.Workspace == _defaultName && section.FieldsCount == 0); }🔲 Чтобы ваш тест запускался, укажите над методом [TestMethod];
🔲 Тестирующий метод должен быть разбит на три части: объявление переменных, операции, выполнение проверок;
🔲 Если хотя бы один Assert.IsTrue() вернет false, тест не будет выполнен успешно
/// <summary> /// Обновление поля с корректными параметрами. /// </summary> /// <param name="type">Тип поля.</param> /// <param name="value">Значение поля.</param> [DataRow(typeof(int), "1")] [DataRow(typeof(double), "123,1")] [DataRow(typeof(DateTime), "28/12/2019")] [DataRow(typeof(bool), "true")] [DataRow(typeof(string), "Hello")] [TestMethod] public void UpdateField_WithCorrectArguments_ShouldUpdateField(Type type, string value) { var section = new Section(_defaultName, _defaultCode, _defaultName); var newCode = "NrbNewCode"; var newName = "Новое название"; var newRequiredFieldFlag = false; var correctFieldsCount = 1; section.AddField(_defaultName, _defaultCode, type, _defaultRequiredFieldFlag, value); section.UpdateField(_defaultCode, newCode, newName, type, newRequiredFieldFlag, value); Assert.IsTrue(section.GetValueInField(newCode) == value && section.FieldsCount == correctFieldsCount); }🔲 Для выполнения теста несколько раз с разными параметрами используйте DataRow
/// <summary> /// Создание раздела с помощью null-значений в конструкторе с двумя параметрами. /// </summary> /// <param name="name">Название раздела.</param> /// <param name="code">Код раздела.</param> /// <exception cref="ArgumentNullException">Текст не содержит символов или равен null!</exception> [ExpectedException(typeof(ArgumentNullException))] [DataRow("Название", null)] [DataRow(null, "NrbCode")] [TestMethod] public void CreateSectionByTwoArguments_WithNullValues_ShouldThrowArgumentNullException(string name, string code) { new Section(name, code); }🔲 Чтобы ваш тест отработал корректно при сработанном исключении, необходимо добавить [ExpectedException]
⬆️Оглавление
NSubstitute является удобной заменой mock-библиотек .NET. Для начала нам необходимо создать объект, который мы будем настраивать в зависимости от наших потребностей:
/// <summary> /// Раздел. /// </summary> private Section _section = Substitute.For<Section>(DefaultName, DefaultCode);/// <summary> /// Обновление поля с существующим кодом. /// </summary> [TestMethod] public void UpdateField_WithCorrectArguments_ShouldUpdateField() { _section.IsFieldExistence(Arg.Is(DefaultCode)) .Returns(true); _section.IsFieldExistence(Arg.Is(_newCode)) .Returns(false); _section.GetField(Arg.Is(DefaultCode)) .Returns(_defaultField); _section.UpdateField(DefaultCode, _newCode, DefaultName, DefaultType, _defaultRequiredFieldFlag, DefaultIntValueInString); _section.Received().IsFieldExistence(Arg.Is(DefaultCode)); _section.Received().IsFieldExistence(Arg.Is(_newCode)); _section.Received().GetField(Arg.Is(DefaultCode)); }1️⃣ Перед обновлением параметров поля в первую очередь мы должны убедиться, что поле, данные которые мы хотим изменить, существует. Также важно, что новое название для нашего поля не должно быть кем-то занято.
2️⃣ Также настраиваем метод GetField, который вернет нам объект поля по его коду. После выполнения метода UpdateField мы проверяем, были ли вызваны методы IsFieldExistence и GetField.
❌ Обратите внимание! Для того, чтобы возвращаемое значение метода можно было настроить, он должен быть виртуальным (иметь модификатор virtual).
/// <summary> /// Добавление поля с корректными параметрами. /// </summary> [TestMethod] public void AddField_WithCorrectArguments_ShouldAddField() { _section.IsFieldExistence(Arg.Is(DefaultCode)) .Returns(false); _section.AddField(DefaultName, DefaultCode, DefaultType, _defaultRequiredFieldFlag, DefaultIntValueInString); _section.Received().IsFieldExistence(Arg.Is(DefaultCode)); _section.DidNotReceive().GetField(Arg.Any<string>()); }/// <summary> /// Добавление поля в раздел с колбэком. /// </summary> [TestMethod] public void GetField_WithCallBack_ShouldGetCallBack() { var index = 0; _section.When(section => section.GetField(DefaultCode)) .Do(section => index++); var correctIndex = 1; _section.GetField(DefaultCode); Assert.IsTrue(index == correctIndex); }/// <summary> /// Получение корректного значения свойства названия раздела по умолчанию. /// </summary> [TestMethod] public void GetDefaultSectionNameProperty_WithForPartsOf_ShouldGetCorrectResult() { var section = Substitute.ForPartsOf<Section>(DefaultName, DefaultCode); var correctDefaultSectionName = "Название раздела по умолчанию"; Assert.IsTrue(section.DefaultSectionName == correctDefaultSectionName); }