統合テストでテストデータを追加する

asp.net-core c# entity-framework-core integration-testing xunit

質問

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);
    }
}

人気のある回答

私はここで何かを逃しているかもしれません(.Net Coreの知識はありますが、決して使用しませんでした)。しかし、これは純粋なユニットテストではなく統合テストであると言いますから、別のアプローチがあります:

  • 統合テストでは、単にサービスへのコール/接続をテストするだけです(つまり、データベースの内容に関係なく、自分のシナリオで「従業員」と呼ぶことができるかどうかをテストすること)
  • 新しいテストを作成する(理想的には単体テストですが、それに直面してみましょう。統合テストはこの世界で確かに存在します)、従業員のメソッド/関数の機能をテストします

上記のオプションがない場合は、単純なデータベースインタラクションコードを呼び出すことによって、テストクラスのクラスを構築する(メソッドやクラスの設定メソッドの1つ - xUnitで名前を忘れる)それがちょうど種であれば、エキゾチックでファンシーなものであれば、それに続くテストの終了が引き裂かれます。おそらく基本的なdb接続とクエリの実行で十分でしょう。

これはあなたの質問に直接的には答えていないと思っています。



Related

ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ