AspNetCore上的unit testing控制器模型validation
在ASPNET核心项目中,我正在尝试创建一些unit testing,以validation我的数据validation逻辑是否正常工作。
我的控制器非常简单:
[HttpPost] [Route("Track")] public void Track([FromBody] DataItem item) { if (!ModelState.IsValid) throw new ArgumentException("Bad request"); _dataItemSaver.SaveData(item); }
我正在使用一个测试基类,它将_myController
对象设置为测试中的控制器。
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(options => { options.UseInMemoryDatabase(); }) .AddScoped() .AddScoped() .Configure(_config.GetSection(nameof(MyConfig))); services .AddMvc(mvcOptions => { mvcOptions.Filters.AddService(typeof(GlobalExceptionFilter), 0); }); _additionalDISetupActions?.Invoke(services); _serviceProvider = services.BuildServiceProvider(); _myController = _serviceProvider.GetService(); }
测试再次非常简单:
[TestMethod] public void Prop3Required() { // Arrange var dataItem = new DataItem() { Prop1 = "Prop1", Prop2 = "Prop2" }; // Act & Assert Assert.ThrowsException(() => _myController.Track(dataItem)); }
我发现,即使我的DataItem
缺少必需的属性(本例中为Prop3
),运行unittest时ModelState.IsValid
为true
。 当使用相同的输入通过Web测试控制器时,validation工作正常(对于ModelState.IsValid
返回false
)。
如何从unit testing中正确触发ASPNET核心逻辑以进行模型状态validation?
您应该看一下使用ASP.NET Core进行集成测试( https://docs.microsoft.com/en-us/aspnet/core/testing/integration-testing ),这是一种非常简单的方法来托管您的应用程序测试上下文并测试整个管道。
如文档中所述,您可以在测试方法中执行以下操作:
_server = new TestServer(new WebHostBuilder().UseStartup()); _client = _server.CreateClient(); // Pass a not valid model var response = await _client.PostAsJsonAsync("Track", new DataItem()); Assert.IsFalse(response.IsSuccessStatusCode);
如果要进行纯unit testing,则需要手动模拟模型状态错误,因为模型状态validation仅在运行时触发。
_myController.ModelState.AddModelError("yourItemFieldHere", "Your validation type here");
有关详细信息,请参阅https://docs.microsoft.com/en-us/aspnet/core/mvc/controllers/testing
- 无法使用Asp.NET Core中的Entity Framework添加带有视图的Scaffold> MVC Controller
- ASPNET 5 MVC 6中的远程validation
- 实体类型上的导航尚未添加到模型中,或被忽略,或者实体类型被忽略
- AspNet.Security.OpenIdConnect.Server。 刷新令牌
- 拦截asp.net核心授权操作以在成功授权后执行自定义操作
- ASP.NET核心中的承载令牌认证
- ASP.NET Core 2 – 身份 – 自定义角色的DI错误
- 如何在ASP.NET Core中将403 Forbidden响应作为IActionResult返回
- Post FromBody始终无效