xUnit Assembly Fixture

生命週期貫穿整個測試的 fixture。

注意:此為 v3 的功能,v2 需要使用其他套件輔助或是使用官方範例裡的寫法。

https://github.com/xunit/samples.xunit/tree/main/AssemblyFixtureExample

生命週期

  • 初始化:組件載入後
  • 清除:組件卸載前

建立 Assembly Fixture 類別

寫法和觀念就和 Class Fixture 一樣,其實這個也可以用在 Class Fixture。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public class DatabaseAssemblyFixture : IDisposable
{
public DatabaseAssemblyFixture()
{
// Docker 啟動 container 和建立資料庫
}

// Dispose 同 [AssemblyCleanup]
public void Dispose()
{
// Docker 刪除 container
}

private static void PrintMssqlVersion(string conn)
{
using var connection = new SqlConnection(conn);
using var command = new SqlCommand("SELECT @@VERSION", connection);
connection.Open();

var reader = command.ExecuteReader();
reader.Read();

Console.WriteLine($"MSSQL Version: {reader.GetString(0)}");
}
}

使用方式

加入 assembly attribute

方法一:新增一個 AssemblyInfo.cs,在裡面加入(建議)

1
2
3
using RepositoryTests.Fixtures;

[assembly: AssemblyFixture(typeof(DatabaseAssemblyFixture))]

方法二:在測試類別的 namespace 上面加入

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[assembly: AssemblyFixture(typeof(DatabaseAssemblyFixture))]

namespace RepositoryTests.Implement
{
public class MemberRepositoryTests
{
private readonly DatabaseAssemblyFixture _db;

public class MemberRepositoryTests(DatabaseAssemblyFixture db)
{
this._db = db;
}

// 測試方法...
}
}

參考