xUnit Class Fixture

簡單介紹一下 xUnit 中的 Class Fixture。主要就是繼承 IClassFixture<T> 、建構式注入。

生命週期

  • 初始化:有用到這個 fixture 的測試類別載入後
  • 清除:類別內所有測試都執行完後

建立 Class Fixture 類別

此類別其實就只是普通的類別,只需要注意在建構式和 Dispose 撰寫初始化和清除的程式。如果有需要,裡面也可以提供一些屬性讓外部使用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class CommonClassFixture
{
public IUnitOfWork UnitOfWork { get; private set; }
public IMapper Mapper { get; private set; }
public IFixture Fixture { get; private set; }

public CommonClassFixture()
{
this.UnitOfWork = Substitute.For<IUnitOfWork>();
var config = new MapperConfiguration(cfg =>
{
cfg.AddProfile<ServicesProfile>();
});
this.Mapper = new Mapper(config);
this.Fixture = new Fixture();
}
}

使用方式

必須繼承 IClassFixture<T> 才能使用 class 層級的 fixture,而且可以同時繼承多個。

以下是單純使用 Class Fixture 的範例:

1
2
3
4
public class MemberServiceTests : IClassFixture<CommonClassFixture>
{
// 測試方法...
}

以下是會用到 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
public class MemberServiceTests : IClassFixture<CommonClassFixture>
{
private readonly CommonClassFixture _commonFixture;
private readonly IAppLogger<MemberEntity> _logger;
private readonly AdminMemberService _sut;

public MemberServiceTests(CommonClassFixture commonFixture)
{
this._commonFixture = commonFixture;
this._logger = Substitute.For<IAppLogger<AdminMember>>();
this._sut = new MemberService(this._commonFixture.UnitOfWork, this._commonFixture.Mapper, this._logger);
}

// 測試方法...
public void SampleTestMethod()
{
// arrange
var id = 1;

var member = this._commonFixture.fixture.Build<MemberEntity>()
.With(q => q.Id, id)
.With(q => q.Status, 1)
.Create();

// 以下省略
}
}

參考