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#
- Host: GitHub
- URL: https://github.com/stacenko-developer/unittests
- Owner: stacenko-developer
- License: mit
- Created: 2023-05-06T12:41:03.000Z (over 2 years ago)
- Default Branch: main
- Last Pushed: 2023-06-16T16:06:09.000Z (over 2 years ago)
- Last Synced: 2025-02-02T09:11:15.014Z (8 months ago)
- Topics: csharp, mstest, net6, nsubstitute, unittests
- Language: C#
- Homepage:
- Size: 67.4 KB
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
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
[](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:Оглавление](#Оглавление)