我正在使用xUnit为我的。net Core应用编写集成测试。我有很多东西要测试,但为了简单起见,我将使用这个示例。我需要测试这些东西("document"只是一个字符串,我不处理文件):
- 注册新员工
- 以员工身份登录
- 为员工添加新文档
- 给文档添加注释
测试当然应该彼此独立运行,但我不能向不存在的文档添加注释。我需要文档存在以测试添加注释,但员工必须也存在以添加文档。
我已经为我想要使用的所有实体编写了测试类,但我不知道如何在给定测试的数据库中实际获取它们。我如何为给定的测试"播种"数据库?
TestStartup.cs
:
public class TestFixture : IDisposable
{
readonly TestServer _server;
public HttpClient _client { get; }
public TestFixture()
{
var builder = new WebHostBuilder()
.UseContentRoot(@"..........srcMyProj.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),但正如你所说,这是一个集成测试,而不是一个纯粹的单元测试,那么另一种方法是:
- 让集成测试仅仅测试对服务的调用/连接(即测试我认为在您的场景中可以调用"雇员"-无论数据库内容如何)
- 创建一个新测试(理想情况下是单元测试,但让我们面对集成测试在这个世界上肯定有一席之地)来测试'employees'方法/函数的功能
如果上面的方法不适合您,如何考虑通过调用简单的数据库交互代码在测试类(方法或类设置方法之一-我忘记了它们在xUnit中的名称)中播种db,如果它只是一个种子,然后是随后的测试结束拆除,则不必有任何奇特或花哨的东西。一个基本的数据库连接和查询执行大概就足够了。
感谢这不是直接回答你的问题,更多的是一个局外人的观点。