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);
}