Как писать юнит тесты?

Мне надо написать несколько 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 шт):

Автор решения: A K

На ваш код не напишешь тесты, у вас должен быть выделен отдельно класс калькулятора в проекте.

Обычно выделяют отдельный проект под бизнес-логику, отдельный проект под инфраструктуру, поэтому я расположу калькулятор в отдельный проект, а не в 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>

Вроде всё.

→ Ссылка