在集成测试中添加测试数据

时间:2016-10-15 18:15:36

标签: c# asp.net-core integration-testing entity-framework-core 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);
    }
}

1 个答案:

答案 0 :(得分:0)

我可能在这里缺少一些东西(知识,但从未使用过.Net Core),但正如你所说这是一个集成测试而不是纯单元测试,所以另一种方法是:

  • 进行集成测试只是测试服务的呼叫/连接(即测试“我认为在您的方案中可以调用员工” - 无论数据库内容如何)
  • 创建一个新的测试(理想情况下是单元测试,但让它面对集成测试肯定在这个世界中占有一席之地)来测试员工的功能。方法/功能

如果以上不是您的选项,请考虑通过调用简单的数据库交互代码来考虑在测试类(方法或类设置方法之一 - 我忘记在xUnit中的名称)中播种数据库如果它只是一颗种子,接着是随后的测试结束后的撕裂,那么它不必是任何异国情调或幻想。基本的数据库连接和查询执行可能就足够了。

欣赏这并不能直接回答你的问题,更多的是局外人的观点。