此代码在 async/await 场景中执行此操作:
Code Reference
public async static Task AssertThrowsAsync<T>(Task task, string expectedMessage) where T : Exception
{
try
{
await task;
}
catch (Exception ex)
{
if (ex is T)
{
Assert.AreEqual(expectedMessage, ex.Message);
return;
}
Assert.Fail($"Expection exception type: {typeof(T)} Actual type: {ex.GetType()}");
}
Assert.Fail($"No exception thrown");
}
示例用法:
Code Reference
[TestMethod]
public async Task TestBadRequestThrowsHttpStatusCodeException()
{
var mockHttp = new MockHttpMessageHandler();
const HttpStatusCode statusCode = HttpStatusCode.BadRequest;
mockHttp.When("https://restcountries.eu/rest/v2/")
.Respond(statusCode, "application/json", JsonConvert.SerializeObject(new { Message = "Test", ErrorCode = 100 }));
var httpClient = mockHttp.ToHttpClient();
var factory = new SingletonHttpClientFactory(httpClient);
var baseUri = new Uri("https://restcountries.eu/rest/v2/");
var client = new Client(new NewtonsoftSerializationAdapter(), httpClientFactory: factory, baseUri: baseUri, logger: _logger.Object);
await AssertThrowsAsync<HttpStatusException>(client.GetAsync<List<RestCountry>>(), Messages.GetErrorMessageNonSuccess((int)statusCode, baseUri));
}
这相当于同步情况
public static void AssertThrows<T>(Action action, string expectedMessage) where T : Exception
{
try
{
action.Invoke();
}
catch (Exception ex)
{
if (ex is T)
{
Assert.AreEqual(expectedMessage, ex.Message);
return;
}
Assert.Fail($"Expection exception type: {typeof(T)} Actual type: {ex.GetType()}");
}
Assert.Fail($"No exception thrown");
}
注意:这断言异常继承自给定类型。如果要检查特定类型,则应检查类型相等性,而不是使用 is 运算符。