dotnet hello world

潼关路边的一只野鬼發表於2024-08-03

參考資料

dotnet 命令參考

使用 dotnet test 和 xUnit 在 .NET 中對 C# 進行單元測試

Declaring InternalsVisibleTo in the csproj

XUnit輸出訊息

建立控制檯專案

# 建立專案目錄
md DotnetStudy
cd DotnetStudy

# 建立解決方案
dotnet new sln
# 建立控制檯專案,-n: 名稱,--use-program-main: 不適用頂級語句
dotnet new console -n HelloDotnet --use-program-main
# 將專案新增到解決方案
dotnet sln add HelloDotnet\HelloDotnet.csproj
# 編譯
dotnet build --configuration Release
# 執行
dotnet run --configuration Release --project HelloDotnet\HelloDotnet.csproj

新增一個類

namespace HelloDotnet
{
    internal class Calc
    {
        public int Add(int a, int b)
        {
            return a + b;
        }
    }
}

新增單元測試專案

# 建立 xunit 專案
dotnet new xunit -o HelloDotnet.Tests
# 將 xunit 專案新增到解決方案
dotnet sln add HelloDotnet.Tests\HelloDotnet.Tests.csproj
# 將控制檯專案作為依賴新增到 xunit 專案
dotnet add HelloDotnet.Tests\HelloDotnet.Tests.csproj reference HelloDotnet\HelloDotnet.csproj

設定單元測試可訪問 internal

<Project Sdk="Microsoft.NET.Sdk">

	<PropertyGroup>
		<OutputType>Exe</OutputType>
		<TargetFramework>net8.0</TargetFramework>
		<ImplicitUsings>enable</ImplicitUsings>
		<Nullable>enable</Nullable>
	</PropertyGroup>

	<!-- 設定單元測試可訪問 internal -->
	<ItemGroup>
		<AssemblyAttribute Include="System.Runtime.CompilerServices.InternalsVisibleToAttribute">
			<_Parameter1>HelloDotnet.Tests</_Parameter1>
		</AssemblyAttribute>
	</ItemGroup>
</Project>

單元測試程式碼

namespace HelloDotnet.Tests;

public class UnitTest1
{
    [Fact]
    public void Test1()
    {
        Calc calc = new();
        Assert.Equal(3, calc.Add(1, 2));
    }
}

執行單元測試

dotnet test HelloDotnet.Tests\HelloDotnet.Tests.csproj

關於單元測試的輸出

using Xunit.Abstractions;

namespace HelloDotnet.Tests;

public class UnitTest1
{

    ITestOutputHelper output;

    public UnitTest1(ITestOutputHelper output)
    {
        this.output = output;
    }

    [Fact]
    public void Test1()
    {
        output.WriteLine("add test");
        Calc calc = new();
        Assert.Equal(3, calc.Add(1, 2));
    }
}

image

gitignore

dotnet new gitignore