我有班級城市:
public class City
{
public int Id { get; set; }
[Required(ErrorMessage = "This field is required (server validation)")]
public string Name { get; set; }
[Range(1, 100000000, ErrorMessage = "ZIP must be greater than 1 and less than 100000000 (server validation)")]
public int ZIP { get; set; }
[Range(1, 2000000000, ErrorMessage = "Population must be between 1 and 2B (server validation)")]
public int Citizens { get; set; }
public int CountryId { get; set; }
public Country Country { get; set; }
}
我在添加城市的控制器發布操作中:
[HttpPost]
public IActionResult PostCity(City city)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
_cityRepository.Add(city);
return CreatedAtAction("GetCity", new { id = city.Id }, city);
}
我對無效模型進行了測驗:
[Fact]
public void PostCity_InvalidModel_ReturnsBadRequest()
{
// Arrange
City city = new City() { Id=15, Name = "", ZIP = 0, CountryId = 1, Citizens = 0 };
var mockRepository = new Mock<ICityRepositroy>();
var mapperConfiguration = new MapperConfiguration(cfg => cfg.AddProfile(new CityProfile()));
IMapper mapper = new Mapper(mapperConfiguration);
var controller = new CitysController(mockRepository.Object, mapper);
// Act
var actionResult = controller.PostCity(city) as BadRequestResult;
// Assert
Assert.NotNull(actionResult);
}
我除錯測驗,我總是得到 modelState.IsValid = true。當我嘗試在郵遞員中發送無效請求時,服務器驗證作業正常。為什么我的驗證在我的測驗中不起作用?ASP .Net Core 框架是 5.0。
uj5u.com熱心網友回復:
這是因為當您啟動 WebApi 并向其發送真正的請求時,在呼叫控制器操作之前,它會在后臺呼叫幾個方法來驗證您的請求。在這些方法中,它將 ModelState.IsValid 屬性設定為 false。另一方面,當您直接從測驗中呼叫控制器操作時,不會驗證您的請求,因此您的 ModelState.IsValid 默認設定為 true。
uj5u.com熱心網友回復:
你的測驗controller.PostCity(city)直接呼叫方法,而在Web服務器中,當呼叫端點時,會首先觸發并執行一大堆中間件。
其中之一是模型系結器,我相信它也執行驗證。
所以這不起作用:
var controller = new CitysController(mockRepository.Object, mapper);
// Act
var actionResult = controller.PostCity(city) as BadRequestResult;
相反,您需要連接模型的正確驗證機制,或者甚至更好(IMO)使用測驗 Web 服務器,它可以以一種簡單可控的方式執行此操作。
這里基本上是如何做到這一點的,但我建議你也閱讀以下一些文章(來源:MSDN):
public class PrimeWebDefaultRequestShould
{
private readonly TestServer _server;
private readonly HttpClient _client;
public PrimeWebDefaultRequestShould()
{
// Arrange
_server = new TestServer(new WebHostBuilder()
.UseStartup<Startup>());
_client = _server.CreateClient();
}
[Fact]
public async Task ReturnHelloWorld()
{
// Act
var response = await _client.GetAsync("/");
response.EnsureSuccessStatusCode();
var responseString = await response.Content.ReadAsStringAsync();
// Assert
Assert.Equal("Hello World!", responseString);
}
}
EnsureSuccessStatusCode在上面的代碼中,您需要用實際BadRequest測驗用例替換喜歡的內容。
一些額外的閱讀:
https://www.meziantou.net/testing-an-asp-net-core-application-using-testserver.htm
https://docs.microsoft.com/en-us/dotnet/architecture/microservices/multi-container-microservice-net-applications/test-aspnet-core-services-web-apps
https://docs.microsoft.com/en-us/aspnet/core/test/integration-tests?view=aspnetcore-6.0
https://www.roundthecode.com/dotnet/asp-net-core-web-api/asp-net-core-testserver-xunit-test-web-api-endpoints
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/438206.html
上一篇:使用引數更新記憶值
