xUnit 各層級 Fixture 的生命週期
簡單說說 fixture 這東西,裡面充滿意想不到的坑。沒親自實驗過,根本不知道原來裡面 fixture 的建立以及 dispose 的順序是不可控的。其實還是有一些方式來解決這個問題。
各層級 Fixture 的順序
- AssebblyFixture constructure
- CollectionFixture 內部各 fixture 的 constructure
- ClassFxiture constructure
- TestClass constructure
- TestClass dispose
- ClassFixture dispose
- ClassFxiture constructure
- TestClass constructure
- TestClass dispose
- ClassFixture dispose
- ClassFxiture constructure
- CollectionFixture 內部各 fixture 的 dispose
- CollectionFixture 內部各 fixture 的 constructure
- AssemblyFixture dispose
Class Fixture
無法控制裡面 fixture 的建立以及 dispose 的順序。如果需要控制,需要再用一個類別來封裝那幾個 fixture,手動控制順序。雖然原文只有寫建立物件,其實 dispose 的時候也是無法控制的。
原文:
Note that you cannot control the order that fixture objects are created, and fixtures cannot take dependencies on other fixtures. If you have need to control creation order and/or have dependencies between fixtures, you should create a class which encapsulates the other two fixtures, so that it can do the object creation itself.
測試:
2 個基本的 Class Fixture
1 | public class AFixture : IDisposable |
用 2 個 Class Fixture 在同一個 Class 裡
1 | public class MyClass : ICalssFixture<AFixture>, IClassFixture<BFixture> |
結果:
- AFxiture constructure
- BFxiture constructure
- TestClass constructure
- TestClass dispose
- AFixture dispose
- BFixture dispose
如果想要變成這樣:
- AFxiture constructure
- BFxiture constructure
- TestClass constructure
- TestClass dispose
- BFixture dispose
- AFixture dispose
再加一個類別來控制即可
1 | public class ABClassFixture : IDisposable |
直接使用剛剛建立的類別
1 | public class MyClass : IClassFixture<ABClassFixture> |
Collection Fixture
Collection Fixture 建立和釋放物件的順序也是和 Class Fixture 一樣不可控制。如果想要控制順序,需要再仔細考慮一下是否適用,畢竟裡面沒有建構式和 dispose,這是集合多個 Class Fixture 的功能,且生命週期比 Class Fixture 長。