xUnitを使用して.NET Coreアプリケーションの統合テストを作成しています。私はテストしたいことがいろいろありますが、簡潔にするためにこの例を使用します。従業員として 統合テストでテストデータを追加する
- 登録新入社員
- ログイン:私はこれらの事をテストする必要があります(「文書」は、私はファイルを扱うないよ単なる文字列です)
- 文書にコメントを追加
テストは、それぞれ独立して実行することになって、もちろんですが、私は存在しない文書にコメントを追加することはできません。私はコメントを追加するテストするために存在するドキュメントが必要ですが、従業員はまた文書を追加する必要があります。
私が使用するすべてのエンティティのために書かれたテストクラスを持っているが、私は実際に与えられたテスト用のデータベースにそれらを取得する方法がわかりません。どのように私は与えられたテストのためにDBを "シード"できますか?
TestStartup.cs
:
public class TestFixture : IDisposable
{
readonly TestServer _server;
public HttpClient _client { get; }
public TestFixture()
{
var builder = new WebHostBuilder()
.UseContentRoot(@"..\..\..\..\..\src\MyProj.Web")
.UseEnvironment("IntegrationTestDevelopment")
.UseStartup<Web.Startup>();
_server = new TestServer(builder);
_client = _server.CreateClient();
_client.BaseAddress = new Uri("http://localhost:2856");
}
public void Dispose()
{
_client.Dispose();
_server.Dispose();
}
}
Web.Startup
の関連部分:
services.AddEntityFrameworkInMemoryDatabase()
.AddDbContext<MyContext>(options => options.UseInMemoryDatabase());
例のテストクラス:
public class EmployeeTests : IClassFixture<TestFixture>
{
public HttpClient _client;
public EmployeeTests(TextFixture fixture)
{
_client = fixture._client;
}
[Theory]
[MemberData("ValidRegistrations")]
public async Task Register_new_employee_succeeds(EmployeeModel model)
{
var request = Helpers.CreateRequestMessage("POST", "/api/employees", model);
var response = await _client.SendAsync(request);
Assert.Equal(HttpStatusCode.Created, response.StatusCode);
}
}
https://docs.efproject.net/en/latest/miscellaneous/testing.html#sharing-a-database-instance-for-read-only-testsによると、必要なDBエンティティを適切なテスト設定メソッド、コンストラクタなど – Eris