Skip to content

Latest commit

 

History

21 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

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

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

About

Юнит тесты на C#

Topics

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages