- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在为 .NET Core 3.1 Web API
进行集成测试。我关注了这篇文章Painless Integration Testing with ASP.NET Core Web API .这是我的 CustomWebApplicationFactory
:
public class CustomWebApplicationFactory<TStartup> : WebApplicationFactory<TStartup> where TStartup : class
{
protected override void ConfigureWebHost(IWebHostBuilder builder)
{
builder.ConfigureServices(services =>
{
var descriptor = services.SingleOrDefault(d => d.ServiceType == typeof(DbContextOptions<TestDbContext>));
if (descriptor != null)
{
services.Remove(descriptor);
}
services.AddDbContext<TestDbContext>(options =>
{
options.UseInMemoryDatabase("InMemoryTestDb");
});
var sp = services.BuildServiceProvider();
using (var scope = sp.CreateScope())
{
var scopedServices = scope.ServiceProvider;
var db = scopedServices.GetRequiredService<TestDbContext>();
var logger = scopedServices.GetRequiredService<ILogger<CustomWebApplicationFactory<TStartup>>>();
db.Database.EnsureCreated();
try
{
Console.WriteLine("Seeding...");
var players = Utilities.GetTestPlayers(); // Returns 3 test players
db.Players.RemoveRange(db.Players); // Clear the table
db.Players.AddRange(players); // Add 3 test players
db.SaveChanges();
Console.WriteLine($"Players seeded: { db.Players.Count() }");
}
catch (Exception ex)
{
logger.LogError(ex, "An error occurred seeding the " + "database with test messages. Error: {Message}", ex.Message);
}
}
});
}
}
这些是我的测试:对于每个 Controller
,我在单独的类中创建了测试。在测试类的构造函数中,我创建了一个 Client
。像这样的 TestController
(我在 API 中总共有 4 个 Controller ):
public class BaseControllerTest : IClassFixture<CustomWebApplicationFactory<Startup>>
{
protected HttpClient Client { get; }
public BaseControllerTest(CustomWebApplicationFactory<Startup> factory)
{
Client = factory.CreateClient();
}
}
public class TestControllerShould : BaseControllerTest
{
public TestControllerShould(CustomWebApplicationFactory<Startup> factory)
: base(factory)
{
Console.WriteLine("TestControllerShould");
}
[Fact]
public async Task GetHelloWorld()
{
var request = new HttpRequestMessage(new HttpMethod("GET"), "/test/");
var response = await Client.SendAsync(request);
Assert.Equal(HttpStatusCode.OK, response.StatusCode);
var content = await response.Content.ReadAsStringAsync();
Assert.Equal("Hello World!", content);
Assert.False(response.Headers.Contains("Server"), "Should not contain server header");
}
}
我的问题是:
正如您在 CustomWebApplicationFactory
中看到的那样,我在播种时记录日志,这是我看到的日志:
Seeding...
Seeding...
Seeding...
Seeding...
Players seeded: 12
Players seeded: 12
Players seeded: 12
Players seeded: 12
我总共有 4 个 Controller ,我只为 3 个玩家播种。为什么我看到 12?我不明白。看起来行 db.Players.AddRange(players);
在任何 db.SaveChanges();
之前被调用了 4 次(对于每个 Controller 测试类)。然后 db.SaveChanges();
被连续调用了 4 次。为什么?
我的问题是:这是为什么?以及如何在集成测试中正确播种测试数据?
(如果不是通过回答,任何对一篇好文章的引用都将非常感谢)
谢谢
最佳答案
它为每个 Controller 调用 ConfigureServices
。所以在这里你可以做一件事在调用 db.Database.EnsureCreated()
之前调用 db.Database.EnsureDeleted()
。它将为每个 Controller 重新初始化内存数据库。
关于c# - 如何使用 WebApplicationFactory 播种测试数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62247368/
我正在为 .NET Core 3.1 Web API 进行集成测试。我关注了这篇文章Painless Integration Testing with ASP.NET Core Web API .这是
我正在尝试用 MockMessageFormatter 替换 IMessageFormatter 的实现进行测试。 public class MyMockingWebApplicationFactor
我已经配置了一个 xUnit 项目来测试 Identity Server 的实现。我创建了一个 TestStartup继承 Startup 的类并覆盖我的 Identity Server 实现以进行测
有谁知道是否可以在同一单元测试中托管WebApplicationFactory()的多个实例? 我已经尝试过并且似乎无法解决这一问题。 IE _client = WebHost.GetFactory(
我正在使用自定义 WebApplication 工厂 public class CustomWebApplicationFactory : WebApplicationFactory where TS
我正在尝试让我的集成测试针对 protected api 端点进行工作。我的测试调用 IDS 连接/ token 端点并获取有效 token 。当我用它来调用 protected api 时,我总是会
我正在尝试让我的集成测试针对 protected api 端点进行工作。我的测试调用 IDS 连接/ token 端点并获取有效 token 。当我用它来调用 protected api 时,我总是会
我的应用程序设计为独立的 aspnet core webapi 自托管可执行文件。 要启动可执行文件,必须将配置文件路径作为命令行参数传递(例如 MyServer.exe --config "path
我需要替换 WebApplicationFactory 中的上下文。我有 MyDbContext,我想用 SQLite 上下文替换它以进行测试。 替换部分工作正常 .ConfigureServices
我正在为我的应用编写集成测试,它使用 .net5 我使用 WebApplicationFactory 和 IHostBuilder 来设置环境。 自定义夹具 -> public class TestF
在 ASP.NET Core 6 中,默认模板将所有内容从 Sturtup.cs 移动进入 Program.cs , 并在 Program.cs 中使用顶级语句,因此没有更多(可说的)Program类
我有一个 ASP.NET Core Web 应用程序并使用 WebApplicationFactory 进行测试设置测试我的 Controller 操作。我之前使用过 RawRabbit,我很容易模拟
我正在为 ASPNetCore Web API 项目编写集成测试。在阅读它时,我遇到了两个术语,首先是 Microsoft.AspNetCore.Mvc.Testing.WebApplicationF
我正在自定义 WebApplicationFactory 以使用原始应用程序项目中的 Startup、appsettings。 目的是创建指向原始应用程序启动的集成测试。 dbcontext 的 ap
我有一个 ASP.NET Core 项目,其中包含一些简单的 Razor 页面和一个 Web API Controller 。 我正在使用 Clean Architecture作为起点。我重命名了项目
我有两个定义如下的集成测试类。当我在 ApiControllerIT 中运行测试时,所有测试都成功运行。 FoundationControllerIT 也是如此。但是,当我同时运行两者时(通过运行封闭
我有一个 ASP.NET Core 2.2 WebApi 项目,它也使用 EF Core 2.2。该项目通过集成测试进行了测试 WebApplicationFactory . 我尝试将 web api
我想使用 WebApplicationFactory 设置我的测试如详述 Integration tests in ASP.NET Core . 在我的一些测试之前,我需要使用在真正的 Startup
我是一名优秀的程序员,十分优秀!