どのようにasp.netのコア統合テストでデータベースの動作をテストするには?

asp.net-core dependency-injection entity-framework-core integration-testing

質問

私は自分のアプリケーションを統合テストしようとしています。

たとえば、私のAbControllerにはPostAb(AbDTO abDTO)メソッドがあり、このメソッドを呼び出すとdbにabDTOが追加されることをテストしたいと思います。

今私のテストのセットアップ:

    [SetUp]
    public void SetUp()
    {
        _server = new TestServer(new WebHostBuilder()
            .UseEnvironment("testing")
            .UseStartup<Startup>());

        _client = _server.CreateClient();
    }

私のテストは次のようになります:

    [Test]
    public async Task PostAbSanity()
    {
        await _client.PostAsync("/rest/v1/Ab", new Ab{Id=1});
        _context.Abs.find(1).should().NotBeNull();
    }

しかし、どうすれば_contextをテストに注入できますか?私のアプリでは、コンストラクタを介して注入しますが、テストでは私は傾けることができません。

ありがとう!

人気のある回答

インメモリデータベースとの統合テストは最も徹底的で安全な作業方法であると私は認めるでしょうが、私の特定の状況はこの局面を非常に困難で時間のかかるものにするでしょう。私はテスト期間の後に上書きするホスト型SQL開発サーバーを使用しています。私は数日間働きました、そして、私が探していた結果を私に与えたプロセスであることが以下であるとわかりました。

  • DotNet Core 2.1
  • 私のデータアクセス層に書かれたビジネスロジックをテストする必要がある六角形(オニオン)アーキテクチャ

私が追加したProgram.CSファイル:

//for integration testing
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
    WebHost.CreateDefaultBuilder(args)
    .ConfigureServices(services => services.AddAutofac())
    .UseStartup<Startup>();

私の統合テストファイル:

using Core.Data.Entities.Model;
using Core.Data.Entities.UTIA;
using FluentAssertions;
using Microsoft.AspNetCore.Mvc.Testing;
using Microsoft.EntityFrameworkCore;
using Profile.Data.Repos;
using Profile.Domain.DomainObjects;
using Super2.Web;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Threading.Tasks;
using Xunit;

namespace Profile.Test
{
    public class EmployeeProfileIntegrationTest : IClassFixture<WebApplicationFactory<Startup>>
    {
        private readonly HttpClient _client;

        public EmployeeProfileIntegrationTest(WebApplicationFactory<Startup> factory)
        {
            _client = factory.CreateClient();

        }

        private DBContext GetContext()
        {
            var options = new DbContextOptionsBuilder<DBContext>()
                .UseSqlServer("Server = 'Connection String from appsettings'")
                .Options;

            var context = new DBContext(options);
            return context;
        }



        [Fact]
        public async Task TestChildProtectionEmployeeGetData()
        {
            //Arrange
            var ApplicationUserId = XXXX;
            var repo = new EmployeeProfileRepo(GetContext());

            //ACT
            var sut = await repo.GetChildProtectionHistory(ApplicationUserId);

            //Assert
            var okResult = sut.Should().BeOfType<List<DomainObject>>().Subject;
            okResult.First().ApplicationUserId.Should().Be(XXXX);
        }
    }
}

私は自分のコンテキストを別のレイヤーに注入していますが、コントローラーでも同じように機能すると思います。 testserverがデフォルトのCore2.1 IWebHostの代わりにIWebHostBuilderを探していたので、これが私にいくつかの問題を引き起こしたので、私はスタートアップスニペットを含めました。

いずれにせよ、これは私のために働いた。あなたがこれからいくらかの助けを得ることができると思います。



Related

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