如何在asp.net核心集成測試中測試數據庫操作?

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

我正在嘗試集成測試我的應用程序。

例如,在我的AbController我有PostAb(AbDTO abDTO)方法,我想測試調用此方法會將abDTO添加到db。

現在我的測試設置:

    [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正在尋找IWebHostBuilder而不是默認的Core2.1 IWebHost。

無論哪種方式,這對我有用。希望你能從中得到一些幫助。



Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow