An open API service indexing awesome lists of open source software.

https://github.com/stacenko-developer/unittests

Юнит тесты на C#
https://github.com/stacenko-developer/unittests

csharp mstest net6 nsubstitute unittests

Last synced: 7 months ago
JSON representation

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

Awesome Lists containing this project

README

          

# UnitTests

## Оглавление

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

## MSTest
__MSTest__ (Microsoft Test) позволяет тестировать различные элементы программного обеспечения, например, функции и классы. Данный фреймворк будет полезен вам для быстрого тестирования ваших проектов.


____
### Тестирование корректной отработки создания секции с помощью конструктора с параметрами
```C#
///
/// Проверка корректности работы свойств раздела.
///
[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);
}
```
:black_square_button: Чтобы ваш тест запускался, укажите над методом __[TestMethod]__;

:black_square_button: Тестирующий метод должен быть разбит на три части: объявление переменных, операции, выполнение проверок;

:black_square_button: Если __хотя бы один__ Assert.IsTrue() вернет false, тест не будет выполнен успешно


____
### Вызов тестирующего метода с несколькими параметрами
```C#
///
/// Обновление поля с корректными параметрами.
///
/// Тип поля.
/// Значение поля.
[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);
}
```
:black_square_button: Для выполнения теста несколько раз с разными параметрами используйте __DataRow__



____
### Тестирование бросания исключения типа ArgumentNullException
```C#
///
/// Создание раздела с помощью null-значений в конструкторе с двумя параметрами.
///
/// Название раздела.
/// Код раздела.
/// Текст не содержит символов или равен null!
[ExpectedException(typeof(ArgumentNullException))]
[DataRow("Название", null)]
[DataRow(null, "NrbCode")]
[TestMethod]
public void CreateSectionByTwoArguments_WithNullValues_ShouldThrowArgumentNullException(string name,
string code)
{
new Section(name, code);
}
```
:black_square_button: Чтобы ваш тест отработал корректно при сработанном исключении, необходимо добавить __[ExpectedException]__


[:arrow_up:Оглавление](#Оглавление)
## NSubstitute
[![Nuget](https://img.shields.io/nuget/v/NSubstitute.svg)](https://www.nuget.org/packages/NSubstitute)

NSubstitute является удобной заменой mock-библиотек .NET. Для начала нам необходимо создать объект, который мы будем настраивать в зависимости от наших потребностей:
```C#
///
/// Раздел.
///
private Section _section = Substitute.For(DefaultName, DefaultCode);
```
____
### Проверка вызова подмены через Received и DidNotReceive
```C#
///
/// Обновление поля с существующим кодом.
///
[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));
}
```
:one: Перед обновлением параметров поля в первую очередь мы должны убедиться, что поле, данные которые мы хотим изменить, существует. Также __важно__, что новое название для нашего поля не должно быть кем-то занято.

:two: Также настраиваем метод __GetField__, который вернет нам объект поля по его коду. После выполнения метода __UpdateField__ мы проверяем, были ли вызваны методы __IsFieldExistence__ и __GetField__.


:x: __Обратите внимание!__ Для того, чтобы возвращаемое значение метода можно было настроить, он должен быть __виртуальным__ (иметь модификатор __virtual__).
____
### Проверка передачи аргументов через Any и Is
```C#
///
/// Добавление поля с корректными параметрами.
///
[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());
}
```
____
### Условные действия через When и Do
```C#
///
/// Добавление поля в раздел с колбэком.
///
[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
```C#
///
/// Получение корректного значения свойства названия раздела по умолчанию.
///
[TestMethod]
public void GetDefaultSectionNameProperty_WithForPartsOf_ShouldGetCorrectResult()
{
var section = Substitute.ForPartsOf(DefaultName, DefaultCode);
var correctDefaultSectionName = "Название раздела по умолчанию";

Assert.IsTrue(section.DefaultSectionName == correctDefaultSectionName);
}
```
[:arrow_up:Оглавление](#Оглавление)