{"id":22544361,"url":"https://github.com/stacenko-developer/unittests","last_synced_at":"2025-10-15T16:52:21.939Z","repository":{"id":162554417,"uuid":"637076594","full_name":"stacenko-developer/UnitTests","owner":"stacenko-developer","description":"Юнит тесты на C#","archived":false,"fork":false,"pushed_at":"2023-06-16T16:06:09.000Z","size":69,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-02-02T09:11:15.014Z","etag":null,"topics":["csharp","mstest","net6","nsubstitute","unittests"],"latest_commit_sha":null,"homepage":"","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/stacenko-developer.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2023-05-06T12:41:03.000Z","updated_at":"2024-07-18T19:15:09.000Z","dependencies_parsed_at":null,"dependency_job_id":"eba0fbe4-f580-417c-a56a-736f6a3cbf35","html_url":"https://github.com/stacenko-developer/UnitTests","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/stacenko-developer%2FUnitTests","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/stacenko-developer%2FUnitTests/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/stacenko-developer%2FUnitTests/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/stacenko-developer%2FUnitTests/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/stacenko-developer","download_url":"https://codeload.github.com/stacenko-developer/UnitTests/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":245991886,"owners_count":20706196,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["csharp","mstest","net6","nsubstitute","unittests"],"created_at":"2024-12-07T14:07:03.974Z","updated_at":"2025-10-15T16:52:16.902Z","avatar_url":"https://github.com/stacenko-developer.png","language":"C#","funding_links":[],"categories":[],"sub_categories":[],"readme":"# UnitTests\n\n\n## Оглавление\n\n\n1. [MSTest](#MSTest)\n    1. [Тестирование корректной отработки создания секции с помощью конструктора с параметрами](#Тестирование-корректной-отработки-создания-секции-с-помощью-конструктора-с-параметрами)\n    2. [Вызов тестирующего метода с несколькими параметрами](#Вызов-тестирующего-метода-с-несколькими-параметрами)\n    3. [Тестирование бросания исключения типа ArgumentNullException](#Тестирование-бросания-исключения-типа-ArgumentNullException)\n2. [NSubstitute](#NSubstitute)\n    1. [Проверка вызова подмены через Received и DidNotReceive](#Проверка-вызова-подмены-через-Received-и-DidNotReceive)\n    2. [Проверка передачи аргументов через Any и Is](#Проверка-передачи-аргументов-через-Any-и-Is)\n    3. [Условные действия через When и Do](#Условные-действия-через-When-и-Do)\n    4. [Замещение одного метода через ForPartsOf](#Замещение-одного-метода-через-ForPartsOf)\n\n\n## MSTest\n__MSTest__ (Microsoft Test) позволяет тестировать различные элементы программного обеспечения, например, функции и классы. Данный фреймворк будет полезен вам для быстрого тестирования ваших проектов.\u003cbr\u003e\u003cbr\u003e\n____\n### Тестирование корректной отработки создания секции с помощью конструктора с параметрами\n```C#\n/// \u003csummary\u003e\n/// Проверка корректности работы свойств раздела.\n/// \u003c/summary\u003e\n[TestMethod]\npublic void GetSectionProperties_FromCorrectSection_ShouldGetCorrectProperties()\n{\n    var section = new Section(_defaultName, _defaultCode,\n        _defaultName);\n\n    Assert.IsTrue(section.Name == _defaultName \u0026\u0026\n        section.Code == _defaultCode \u0026\u0026 section.Workspace == _defaultName\n        \u0026\u0026 section.FieldsCount == 0);\n}\n```\n:black_square_button: Чтобы ваш тест запускался, укажите над методом __[TestMethod]__; \u003cbr /\u003e\n:black_square_button: Тестирующий метод должен быть разбит на три части: объявление переменных, операции, выполнение проверок; \u003cbr /\u003e\n:black_square_button: Если __хотя бы один__ Assert.IsTrue() вернет false, тест не будет выполнен успешно \u003cbr /\u003e\u003cbr /\u003e\n____\n### Вызов тестирующего метода с несколькими параметрами\n```C#\n/// \u003csummary\u003e\n/// Обновление поля с корректными параметрами.\n/// \u003c/summary\u003e\n/// \u003cparam name=\"type\"\u003eТип поля.\u003c/param\u003e\n/// \u003cparam name=\"value\"\u003eЗначение поля.\u003c/param\u003e\n[DataRow(typeof(int), \"1\")]\n[DataRow(typeof(double), \"123,1\")]\n[DataRow(typeof(DateTime), \"28/12/2019\")]\n[DataRow(typeof(bool), \"true\")]\n[DataRow(typeof(string), \"Hello\")]\n[TestMethod]\npublic void UpdateField_WithCorrectArguments_ShouldUpdateField(Type type, string value)\n{\n    var section = new Section(_defaultName, _defaultCode, _defaultName);\n    var newCode = \"NrbNewCode\";\n    var newName = \"Новое название\";\n    var newRequiredFieldFlag = false;\n    var correctFieldsCount = 1;\n\n    section.AddField(_defaultName, _defaultCode, type, _defaultRequiredFieldFlag, value);\n\n    section.UpdateField(_defaultCode, newCode, newName,\n        type, newRequiredFieldFlag, value);\n\n    Assert.IsTrue(section.GetValueInField(newCode) == value\n        \u0026\u0026 section.FieldsCount == correctFieldsCount);\n}\n```\n:black_square_button: Для выполнения теста несколько раз с разными параметрами используйте __DataRow__\n\u003cbr /\u003e\u003cbr /\u003e\n____\n### Тестирование бросания исключения типа ArgumentNullException\n```C#\n/// \u003csummary\u003e\n/// Создание раздела с помощью null-значений в конструкторе с двумя параметрами.\n/// \u003c/summary\u003e\n/// \u003cparam name=\"name\"\u003eНазвание раздела.\u003c/param\u003e\n/// \u003cparam name=\"code\"\u003eКод раздела.\u003c/param\u003e\n/// \u003cexception cref=\"ArgumentNullException\"\u003eТекст не содержит символов или равен null!\u003c/exception\u003e\n[ExpectedException(typeof(ArgumentNullException))]\n[DataRow(\"Название\", null)]\n[DataRow(null, \"NrbCode\")]\n[TestMethod]\npublic void CreateSectionByTwoArguments_WithNullValues_ShouldThrowArgumentNullException(string name,\n    string code)\n{\n    new Section(name, code);\n}\n```\n:black_square_button: Чтобы ваш тест отработал корректно при сработанном исключении, необходимо добавить __[ExpectedException]__ \u003cbr /\u003e\u003cbr /\u003e\n[:arrow_up:Оглавление](#Оглавление)\n## NSubstitute\n[![Nuget](https://img.shields.io/nuget/v/NSubstitute.svg)](https://www.nuget.org/packages/NSubstitute) \u003cbr /\u003e\nNSubstitute является удобной заменой mock-библиотек .NET. Для начала нам необходимо создать объект, который мы будем настраивать в зависимости от наших потребностей:\n```C#\n/// \u003csummary\u003e\n/// Раздел.\n/// \u003c/summary\u003e\nprivate Section _section = Substitute.For\u003cSection\u003e(DefaultName, DefaultCode);\n```\n____\n### Проверка вызова подмены через Received и DidNotReceive\n```C#\n/// \u003csummary\u003e\n/// Обновление поля с существующим кодом.\n/// \u003c/summary\u003e\n[TestMethod]\npublic void UpdateField_WithCorrectArguments_ShouldUpdateField()\n{\n    _section.IsFieldExistence(Arg.Is(DefaultCode))\n        .Returns(true);\n    _section.IsFieldExistence(Arg.Is(_newCode))\n        .Returns(false);\n    _section.GetField(Arg.Is(DefaultCode))\n        .Returns(_defaultField);\n\n    _section.UpdateField(DefaultCode, _newCode, DefaultName, DefaultType,\n        _defaultRequiredFieldFlag, DefaultIntValueInString);\n\n    _section.Received().IsFieldExistence(Arg.Is(DefaultCode));\n    _section.Received().IsFieldExistence(Arg.Is(_newCode));\n    _section.Received().GetField(Arg.Is(DefaultCode));\n}\n```\n:one: Перед обновлением параметров поля в первую очередь мы должны убедиться, что поле, данные которые мы хотим изменить, существует. Также __важно__, что новое название для нашего поля не должно быть кем-то занято. \u003cbr /\u003e\n:two: Также настраиваем метод __GetField__, который вернет нам объект поля по его коду. После выполнения метода __UpdateField__ мы проверяем, были ли вызваны методы __IsFieldExistence__ и __GetField__. \u003cbr /\u003e\u003cbr /\u003e\n:x: __Обратите внимание!__ Для того, чтобы возвращаемое значение метода можно было настроить, он должен быть __виртуальным__ (иметь модификатор __virtual__).\n____\n### Проверка передачи аргументов через Any и Is\n```C#\n/// \u003csummary\u003e\n/// Добавление поля с корректными параметрами.\n/// \u003c/summary\u003e\n[TestMethod]\npublic void AddField_WithCorrectArguments_ShouldAddField()\n{\n    _section.IsFieldExistence(Arg.Is(DefaultCode))\n        .Returns(false);\n    _section.AddField(DefaultName, DefaultCode, DefaultType, _defaultRequiredFieldFlag,\n        DefaultIntValueInString);\n    _section.Received().IsFieldExistence(Arg.Is(DefaultCode));\n    _section.DidNotReceive().GetField(Arg.Any\u003cstring\u003e());\n}\n```\n____\n### Условные действия через When и Do\n```C#\n/// \u003csummary\u003e\n/// Добавление поля в раздел с колбэком. \n/// \u003c/summary\u003e\n[TestMethod]\npublic void GetField_WithCallBack_ShouldGetCallBack()\n{\n    var index = 0;\n    _section.When(section =\u003e section.GetField(DefaultCode))\n        .Do(section =\u003e index++);\n    var correctIndex = 1;\n\n    _section.GetField(DefaultCode);\n\n    Assert.IsTrue(index == correctIndex);\n}\n```\n____\n### Замещение одного метода через ForPartsOf\n```C#\n/// \u003csummary\u003e\n/// Получение корректного значения свойства названия раздела по умолчанию.\n/// \u003c/summary\u003e\n[TestMethod]\npublic void GetDefaultSectionNameProperty_WithForPartsOf_ShouldGetCorrectResult()\n{\n    var section = Substitute.ForPartsOf\u003cSection\u003e(DefaultName, DefaultCode);\n    var correctDefaultSectionName = \"Название раздела по умолчанию\";\n\n    Assert.IsTrue(section.DefaultSectionName == correctDefaultSectionName);\n}\n```\n[:arrow_up:Оглавление](#Оглавление)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fstacenko-developer%2Funittests","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fstacenko-developer%2Funittests","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fstacenko-developer%2Funittests/lists"}