Как писать юнит тесты?
Мне надо написать несколько unit tests на код ниже, проверить output. Может кто подскажет где искать или хотябы один пример?
Prime factors of 4 are: 2 x 2
Prime factors of 7 are: 7
Prime factors of 30 are: 2 x 3 x 5
Prime factors of 40 are: 2 x 2 x 2 x 5
Prime factors of 50 are: 2 x 5 x 5
while (true)
{
try
{
Console.WriteLine("Enter a number greater than 1 : ");
int input = Convert.ToInt32(Console.ReadLine());
int num = input;
int i = 1;
string primeString = "";
while (++i <= num)
{
while (num % i == 0)
{
primeString += " " + i;
num /= i;
}
}
Console.WriteLine("The prime factors of " + input + " are:" + primeString);
Console.WriteLine("Press Enter to check another number");
Console.WriteLine("-------------------------------------------------------");
}
catch (FormatException e)
{
Console.WriteLine(e.Message);
}
Console.WriteLine();
Console.ReadKey();
}
Ответы (1 шт):
На ваш код не напишешь тесты, у вас должен быть выделен отдельно класс калькулятора в проекте.
Обычно выделяют отдельный проект под бизнес-логику, отдельный проект под инфраструктуру, поэтому я расположу калькулятор в отдельный проект, а не в ConsoleApp1.
Хотя бы так, без выделения интерфейса:
using System;
namespace Logic
{
public class Calculator
{
public int Factorial(int num)
{
throw new NotImplementedException();
}
}
}
И в отдельном классе (обычно делают в отдельном проекте, я сделаю отдельный проект Logic.Tests) нужны тесты именно на калькулятор:
using NUnit.Framework;
namespace Logic.Tests
{
/// <summary>
/// Tests for <see cref="Calculator"/>
/// </summary>
public class CalculatorTests
{
[Test]
public void Test01()
{
// Arrange
var calculator = new Calculator();
var input = 5;
var expected = 120;
// Act
var result = calculator.Factorial(input);
// Assert
Assert.AreEqual(expected, result);
}
}
}
И приложение будет иметь примерно такой вид (убрал для наглядности отлов FormatException):
using System;
using Logic;
namespace ConsoleApp1
{
internal static class Program
{
private static void Main()
{
var calculator = new Calculator();
Console.WriteLine("Enter a number:");
var input = EnterNumber();
var result = calculator.Factorial(input);
Console.WriteLine($"Result for {input} is {result}");
}
private static int EnterNumber()
{
string input = Console.ReadLine();
int parsed = Convert.ToInt32(input);
return parsed;
}
}
}
Итого, вот так вышло:
(Проект ConsoleApp1 зависит от Logic, а проект Logic.Tests зависит от Logic, не забудьте подключить проекты в dependencies)
В проекте с тестами не забудьте подключить нужные nuget-пакеты:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netcoreapp3.1</TargetFramework>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.7.1" />
<PackageReference Include="NUnit" Version="3.12.0" />
<PackageReference Include="NUnit3TestAdapter" Version="3.17.0">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets>
</PackageReference>
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Logic\Logic.csproj" />
</ItemGroup>
</Project>
Вроде всё.
