Загрузка данных
Для этого задания нужно сделать **два проекта** в одном решении: библиотеку с решением квадратного уравнения и проект xUnit с тестами. Тестовый проект должен ссылаться на библиотеку — именно так он получает доступ к проверяемому коду.[1]
Ниже — готовый вариант по вашему заданию, дополненный проверками одного корня и отсутствия действительных корней.
## 1. Основной проект — `QuadraticSolution`
Создайте проект типа «Библиотека классов» и замените содержимое файла `Class1.cs` следующим кодом. Сам файл переименуйте в `QuadraticSolver.cs`.
```csharp
using System;
namespace QuadraticSolution
{
public class QuadraticSolver
{
public (int RootCount, double? X1, double? X2) Solve(
double a, double b, double c)
{
if (a == 0)
{
throw new ArgumentException(
"Коэффициент 'a' не может быть равен нулю.");
}
double discriminant = b * b - 4 * a * c;
if (discriminant < 0)
{
return (0, null, null);
}
if (discriminant == 0)
{
return (1, -b / (2 * a), null);
}
double sqrtD = Math.Sqrt(discriminant);
double x1 = (-b - sqrtD) / (2 * a);
double x2 = (-b + sqrtD) / (2 * a);
return (2, x1, x2);
}
}
}
```
Это логика из вашего задания: метод возвращает количество действительных корней и их значения. Здесь не нужны `Main()` и ввод через `Console.ReadLine()` — значения коэффициентов будут передавать тесты.
## 2. Тестовый проект — `QuadraticSolution.Tests`
В том же решении создайте проект «xUnit Test Project». Затем в его разделе «Зависимости» выберите «Добавить ссылку на проект», отметьте `QuadraticSolution` и нажмите OK.[2]
В тестовом проекте переименуйте `UnitTest1.cs` в `QuadraticSolverTests.cs` и вставьте:
```csharp
using System;
using Xunit;
using QuadraticSolution;
namespace QuadraticSolution.Tests
{
public class QuadraticSolverTests
{
[Fact]
public void Solve_TwoRoots_ReturnsCorrectValues()
{
// Подготовка
var solver = new QuadraticSolver();
// Действие: x² - 3x + 2 = 0
var result = solver.Solve(1, -3, 2);
// Проверка
Assert.Equal(2, result.RootCount);
Assert.Equal((double?)1.0, result.X1);
Assert.Equal((double?)2.0, result.X2);
}
[Fact]
public void Solve_OneRoot_ReturnsCorrectValue()
{
// Подготовка
var solver = new QuadraticSolver();
// Действие: x² - 2x + 1 = 0
var result = solver.Solve(1, -2, 1);
// Проверка
Assert.Equal(1, result.RootCount);
Assert.Equal((double?)1.0, result.X1);
Assert.Null(result.X2);
}
[Fact]
public void Solve_NoRealRoots_ReturnsZeroRoots()
{
// Подготовка
var solver = new QuadraticSolver();
// Действие: x² + 1 = 0
var result = solver.Solve(1, 0, 1);
// Проверка
Assert.Equal(0, result.RootCount);
Assert.Null(result.X1);
Assert.Null(result.X2);
}
[Fact]
public void Solve_AIsZero_ThrowsException()
{
// Подготовка
var solver = new QuadraticSolver();
// Действие и проверка
Assert.Throws<ArgumentException>(
() => solver.Solve(0, 5, 2));
}
}
}
```
Первые и последний тесты соответствуют вашему образцу. Два дополнительных проверяют оставшиеся ветви метода.
## 3. Что проверяют тесты
| Тест | Коэффициенты | Ожидаемый результат по коду |
|---|---|---|
| Два корня | `a = 1`, `b = -3`, `c = 2` | `X1 = 1`, `X2 = 2` |
| Один корень | `a = 1`, `b = -2`, `c = 1` | `X1 = 1`, `X2 = null` |
| Нет действительных корней | `a = 1`, `b = 0`, `c = 1` | Количество корней — `0`, оба значения — `null` |
| Недопустимое значение `a` | `a = 0`, `b = 5`, `c = 2` | Исключение `ArgumentException` |
Тесты построены по схеме Arrange–Act–Assert: сначала подготовка объекта, затем вызов метода, после этого проверка результата. Это стандартный подход к организации модульных тестов.[3]
## 4. Как запустить
1. Откройте меню «Тест» → «Обозреватель тестов».
2. Нажмите «Выполнить все тесты».
3. Посмотрите результаты в обозревателе: он показывает успешно пройденные, проваленные и ещё не запущенные тесты.[2][3]
Ожидаемый результат для приведённого варианта — четыре успешно пройденных теста. Это ожидаемый результат по коду, а не отчёт о фактическом запуске в вашей Visual Studio.
Источники
[1] Unit testing C# in .NET using dotnet test and xUnit - Microsoft Learn https://learn.microsoft.com/en-us/dotnet/core/testing/unit-testing-csharp-with-xunit
[2] Get started with unit testing - Visual Studio (Windows) | Microsoft Learn https://learn.microsoft.com/en-us/visualstudio/test/getting-started-with-unit-testing?view=visualstudio
[3] Unit test basics with Test Explorer - Visual Studio - Microsoft Learn https://learn.microsoft.com/en-us/visualstudio/test/unit-test-basics?view=visualstudio
[4] Tutorial: Test a .NET class library - Microsoft Learn https://learn.microsoft.com/en-us/dotnet/core/tutorials/test-class-library
[5] Testing with the xUnit Framework - Overview (2 of 12) - Microsoft Learn https://learn.microsoft.com/en-us/shows/visual-studio-toolbox/testing-with-the-xunit-framework-overview-2-of-12-automated-software-testing
[6] Best practices for writing unit tests - .NET - Microsoft Learn https://learn.microsoft.com/en-us/dotnet/core/testing/unit-testing-best-practices
[7] Testing in .NET - Microsoft Learn https://learn.microsoft.com/en-us/dotnet/core/testing/
[8] Unit test basics with Test Explorer - Visual Studio (Windows) https://learn.microsoft.com/en-sg/visualstudio/test/unit-test-basics?view=vs-2022
[9] Unit test tools and tasks - Visual Studio - Microsoft Learn https://learn.microsoft.com/en-us/visualstudio/test/unit-test-your-code?view=visualstudio
[10] C# - Asserting two objects are equal in unit tests - Stack Overflow https://stackoverflow.com/questions/23530982/c-sharp-asserting-two-objects-are-equal-in-unit-tests