這個 fixture 的功能類似 Class Fixture,也是 class 層級,但是它的生命週期是在所有有用到這個 fixture 的測試中,最先執行的測試前建立,然後在所有有用到這個 fixture 的測試都結束後清除,會比 class 層級還長。
生命週期
- 初始化:所有有用到這個 fixture 的測試中第一個測試類別載入後
- 清除:所有有用到這個 fixture 的測試都執行完後
建立 Collection Fixture 類別
建立好 fixture 類別後,再建立一個類別來專門集合所需的 fixture。這個類別需要繼承 ICollectionFixture<TFixture>
,且可以繼承多個,還要使用 [CollectionDefinition("集合名稱")]
來定義這個集合的名稱。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| public class MapperFixture { public MapperFixture() { var config = new MapperConfiguration(cfg => { cfg.AddProfile<ServicesProfile>(); }); this.Mapper = new Mapper(config); }
internal IMapper Mapper { get; private set; } }
[CollectionDefinition(nameof(CommonCollectionFixture)] public class CommonCollectionFixture : ICollectionFixture<MapperFixture> { }
|
使用方式
運用到的測試類別要加入 [Collection("集合名稱")]
來指定使用哪個集合
1 2 3 4 5 6 7 8 9 10 11 12 13
| [Collection(nameof(CommonCollectionFixture))] public class MemberServiceTests { private readonly MapperFixture _mapperFixture;
public MemberServiceTests(MapperFixture mapperFixture) { this._mapperFixture = mapperFixture; }
}
|
證明生命週期比 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 26 27 28 29 30 31 32 33 34 35 36 37
| public class MyFixture { public MyFixture() { ExceuteCount += 1; }
internal static int ExceuteCount { get; private set; } }
[CollectionDefinition(nameof(MyCollection))] public class MyCollection : ICollectionFixture<MyFixture> { }
[Collection(nameof(MyCollection))] public class TestClassA { [Fact] public void TestFixture的數字應該是1() { Assert.True(MyFixture.ExceuteCount.Equals(1)); } }
[Collection(nameof(MyCollection))] public class TestClassB { [Fact] public void TestFixture的數字應該是1() { Assert.True(MyFixture.ExceuteCount.Equals(1)); } }
|
參考