我剛剛開始使用xUnitClassFixtures中的集合,所以我可能做錯了,但我的理解是我可以創建一個,通過將其分配給一個集合,然后所有具有該屬性的測試類相同的連接名稱將共享固定裝置的相同實例。ICollectionFixture<MyFixture>CollectionDefinitionAttribtueCollection首先用一個簡單的例子來證明Fixture每個測試類只實例化一次public class SampleFixture:IDisposable{ public static int ConstructorCount { get; set; } public static int DisposeCount { get; set; } public SampleFixture() { ConstructorCount++; } public void Dispose() { DisposeCount++; }}public class SampleTestClass1 : IClassFixture<SampleFixture>{ private readonly ITestOutputHelper outputHelper; private readonly SampleFixture sampleFixture; public SampleTestClass1(ITestOutputHelper outputHelper, SampleFixture sampleFixture) { this.outputHelper = outputHelper; this.sampleFixture = sampleFixture; } [Fact] public void Test1() { this.outputHelper.WriteLine($"Test1 - Constructor Count: {SampleFixture.ConstructorCount} DisposeCount: {SampleFixture.DisposeCount}"); Assert.Equal(1,SampleFixture.ConstructorCount); } [Fact] public void Test2() { this.outputHelper.WriteLine($"Test2 - Constructor Count: {SampleFixture.ConstructorCount} DisposeCount: {SampleFixture.DisposeCount}"); Assert.Equal(1,SampleFixture.ConstructorCount); }}運行測試,它們都通過了。1 通過構造函數意味著測試類中的兩個測試都使用我的裝置的同一實例。涼豆子。現在讓我們創建一個CollectionFixture,添加另一個測試類并使用相同的Collection屬性裝飾它們。[CollectionDefinition("SampleFixture")]public class SampleFixtureCollection : ICollectionFixture<SampleFixture>{ }public class SampleFixture:IDisposable{ public static int ConstructorCount { get; set; } public static int DisposeCount { get; set; } public SampleFixture() { ConstructorCount++; } public void Dispose() { DisposeCount++; }}現在我所有的測試都失敗了。查看第二個測試類中失敗測試的消息:測試 1 - 構造函數計數:3 DisposeCount:1看來構造函數被調用了3 次! 在夾具收集啟動期間一次,然后為每個測試類再一次。這里給出了什么?我的兩個測試都綁定到同一個集合,但每個測試類都獲得自己的測試裝置實例。我在這里做錯了什么還是這是一個錯誤?(我在 GitHub 中沒有發現任何提及)。將 xUnit v2.4.1 與 .net core 2.1 結合使用
1 回答

長風秋雁
TA貢獻1757條經驗 獲得超7個贊
我想到了。
使用 Fixture 集合時,測試類不應實現 IClassFixture 接口。
改變
[Collection("SampleFixture")]
public class SampleTestClass1 : IClassFixture<SampleFixture>
{...}
到
[Collection("SampleFixture")]
public class SampleTestClass1 // <-- Removed IClassFixture<SampleFixture>
{...}
解決了問題。
- 1 回答
- 0 關注
- 170 瀏覽
添加回答
舉報
0/150
提交
取消