【发布时间】:2021-07-06 06:15:45
【问题描述】:
这是我在 XUnit 中的测试方法。
[Fact]
public async Task AddCampaign_ReturnBadRequestWhenDateIsInvalid()
{
var client = _factory.CreateClient();
string title = string.Format("Test Add Campaign {0}", Guid.NewGuid());
var campaignAddDto = new CampaignDTORequest
{
Title = title
};
var encodedContent = new StringContent(JsonConvert.SerializeObject(campaignAddDto), Encoding.UTF8, "application/json");
var response = await client.PostAsync("/api/Campaign/add", encodedContent);
var responseString = await response.Content.ReadAsStringAsync();
var result = JsonConvert.DeserializeObject<CampaignDTOResponse>(responseString);
Assert.False(response.IsSuccessStatusCode);
Assert.ThrowsAsync<ArgumentNullException>(()=> client.PostAsync("/api/Campaign/add", encodedContent));
}
第一个断言是有效的。我坚持第二个断言。如何断言异常类型 (ArgumentNullException) 及其异常消息?
这是服务方法
public async Task<Campaign> AddCampaignAsync(Campaign campaign)
{
if (campaign.StartDate.Equals(DateTime.MinValue)) {
throw new ArgumentNullException("Start Date cannot be null or empty.");
}
await _context.Campaigns.AddAsync(campaign);
await _context.SaveChangesAsync();
return campaign;
}
根据雷洋的线索更新。
var exceptionDetails = Assert.ThrowsAsync<ArgumentNullException>(() => client.PostAsync("/api/Campaign/add", encodedContent));
Assert.Equal("Start Date cannot be null or empty.", exceptionDetails.Result.Message);
但还是不行。
System.AggregateException :发生一个或多个错误。 (Assert.Throws() 失败 预期:typeof(System.ArgumentNullException) 实际:(没有抛出异常))
尝试了 Dai 的解决方案,但仍然出现错误。
Assert.Throws() Failure Expected: typeof(System.ArgumentNullException) Actual: (No exception was thrown)
这是我的 API 方法。
public async Task<ActionResult<CampaignDTOResponse>> AddCampaign([FromBody] CampaignDTORequest newCampaign)
{
try
{
var campaign = _mapper.Map<Campaign>(newCampaign);
campaign = await _campaignService.AddCampaignAsync(campaign);
var campaignDtoResponse = _mapper.Map<CampaignDTOResponse>(campaign);
return CreatedAtAction(nameof(GetCampaignById), new { id = campaignDtoResponse.Id }, campaignDtoResponse);
}
catch (Exception ex)
{
_logger.LogError(0, ex, ex.Message);
return Problem(ex.Message);
}
}
更新:我将检查从服务移到 api。
if (newCampaign.StartDate.Equals(DateTime.MinValue))
{
return BadRequest("Start Date cannot be null or empty.");
}
我像下面这样断言它们。
Assert.Equal(HttpStatusCode.BadRequest, response.StatusCode);
Assert.Equal("Start Date cannot be null or empty.", responseString);
【问题讨论】:
-
Assert.Throws有一个返回类型 -
^^ 它返回异常实例,然后您可以在该实例上断言其消息。顺便说一句:我个人爱上了“FluentAssertions”库。它使得提出这种断言对测试人员非常友好。 (非附属)
-
@Steve 你需要
await它。 -
@Steve API 方法使这种 x-y。该方法不会抛出任何东西。因此,即使您的断言 100% 正确,它们也会失败,因为您的测试对象的行为与您的预期不同。
-
@Steve 当
campaign不是不是null时,你的代码会抛出ArgumentNullException(否则它不能取消引用StartDate.Equals)——这简直就是错误。请仔细阅读如何正确表示和执行前提条件。