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.IsValidtrue 。 当使用相同的输入通过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