gpt4 book ai didi

c# - AspNetCore 上的单元测试 Controller 模型验证

转载 作者:太空狗 更新时间:2023-10-29 23:59:41 25 4
gpt4 key购买 nike

在 ASPNET Core 项目中,我尝试创建一些单元测试来验证我的数据验证逻辑是否正常工作。

我的 Controller 非常简单:

[HttpPost]
[Route("Track")]
public void Track([FromBody] DataItem item)
{
if (!ModelState.IsValid) throw new ArgumentException("Bad request");

_dataItemSaver.SaveData(item);
}

我正在使用一个测试基类,它将 _myController 对象设置为被测 Controller 。

    public ControllerTestBase()
{
var builder = new ConfigurationBuilder()
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
.AddJsonFile($"buildversion.json", optional: true)
.AddEnvironmentVariables();
_config = builder.Build();

var services = new ServiceCollection()
.AddEntityFrameworkInMemoryDatabase()
.AddDbContext<MyDbContext>(options =>
{
options.UseInMemoryDatabase();
})
.AddScoped<IDataItemSaver, DataItemSQLStorageService>()
.AddScoped<MyController>()
.Configure<MyConfig>(_config.GetSection(nameof(MyConfig)));

services
.AddMvc(mvcOptions =>
{
mvcOptions.Filters.AddService(typeof(GlobalExceptionFilter), 0);
});

_additionalDISetupActions?.Invoke(services);

_serviceProvider = services.BuildServiceProvider();

_myController = _serviceProvider.GetService<MyController>();
}

再次测试很简单:

    [TestMethod]
public void Prop3Required()
{
// Arrange
var dataItem = new DataItem()
{
Prop1 = "Prop1",
Prop2 = "Prop2"
};

// Act & Assert
Assert.ThrowsException<ArgumentException>(() => _myController.Track(dataItem));
}

我发现在运行单元测试时 ModelState.IsValidtrue 即使我的 DataItem 缺少必需的属性( Prop3 在这个例子中)。当使用相同的输入通过网络测试 Controller 时,验证工作正常(为 ModelState.IsValid 返回 false)。

如何正确触发 ASPNET Core 逻辑以从单元测试进行模型状态验证?

最佳答案

您应该看看使用 ASP.NET Core 进行集成测试 (https://learn.microsoft.com/en-us/aspnet/core/testing/integration-testing),这是一种在测试上下文中托管应用程序并测试整个管道的非常简单的方法。
如文档中所述,您可以在测试方法中执行类似的操作:

_server = new TestServer(new WebHostBuilder().UseStartup<Startup>());
_client = _server.CreateClient();
// Pass a not valid model
var response = await _client.PostAsJsonAsync("Track", new DataItem());
Assert.IsFalse(response.IsSuccessStatusCode);

关于c# - AspNetCore 上的单元测试 Controller 模型验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43229338/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com