Skip to content

stacenko-developer/UnitTests

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

21 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

UnitTests

Оглавление

  1. MSTest
    1. Тестирование корректной отработки создания секции с помощью конструктора с параметрами
    2. Вызов тестирующего метода с несколькими параметрами
    3. Тестирование бросания исключения типа ArgumentNullException
  2. NSubstitute
    1. Проверка вызова подмены через Received и DidNotReceive
    2. Проверка передачи аргументов через Any и Is
    3. Условные действия через When и Do
    4. Замещение одного метода через ForPartsOf

MSTest

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


Тестирование бросания исключения типа ArgumentNullException

/// <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

Nuget
NSubstitute является удобной заменой mock-библиотек .NET. Для начала нам необходимо создать объект, который мы будем настраивать в зависимости от наших потребностей:

/// <summary>
/// Раздел.
/// </summary>
private Section _section = Substitute.For<Section>(DefaultName, DefaultCode);

Проверка вызова подмены через Received и DidNotReceive

/// <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).


Проверка передачи аргументов через Any и Is

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

Условные действия через When и Do

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

Замещение одного метода через ForPartsOf

/// <summary>
/// Получение корректного значения свойства названия раздела по умолчанию.
/// </summary>
[TestMethod]
public void GetDefaultSectionNameProperty_WithForPartsOf_ShouldGetCorrectResult()
{
    var section = Substitute.ForPartsOf<Section>(DefaultName, DefaultCode);
    var correctDefaultSectionName = "Название раздела по умолчанию";

    Assert.IsTrue(section.DefaultSectionName == correctDefaultSectionName);
}

⬆️Оглавление

Releases

No releases published

Packages

No packages published

Languages