MS Test中与xUnit.net IsType等价的返回类型断言方法
在MS Test里实现类似xUnit Assert.IsType()的功能
嘿,我明白你想要的效果——像xUnit里那样,断言类型的同时直接拿到转换后的对象对吧?确实MS Test原生的Assert.IsInstanceOfType只能做断言,返回的是void,没法直接给你转换后的实例。不过有两个简单的办法能实现你要的功能:
方法一:先断言再手动转换
这是最直接的方式,先确认类型正确,再显式转换对象,完全不需要额外封装,结合你的测试片段示例如下:
[TestMethod] // 注意MS Test用[TestMethod]替代xUnit的[Fact]哦 public async Task IndexPost_ReturnsBadRequestResult_WhenModelStateIsInvalid() { // Arrange var mockRepo = new Mock<IBra...>(); // 这里补上你原本的控制器初始化、ModelState加错误等代码 var controller = new YourTargetController(mockRepo.Object); controller.ModelState.AddModelError("SomeProperty", "Invalid value"); // Act var result = await controller.IndexPost(yourTestModel); // Assert // 先断言类型符合预期 Assert.IsInstanceOfType(result, typeof(BadRequestObjectResult)); // 再手动转换 var badRequestResult = (BadRequestObjectResult)result; // 接下来就可以对badRequestResult做进一步验证了,比如检查返回的错误内容 Assert.IsNotNull(badRequestResult.Value); }
方法二:写个自定义扩展方法(复用性更高)
如果你的测试里经常需要这种“断言+转换”的操作,不如封装一个扩展方法,用起来和xUnit的IsType<T>一模一样:
using Microsoft.VisualStudio.TestTools.UnitTesting; public static class AssertExtensions { public static T IsType<T>(object obj) { // 先做类型断言,失败的话会直接抛出测试异常 Assert.IsInstanceOfType(obj, typeof(T)); // 断言通过就返回转换后的对象 return (T)obj; } }
之后在测试里就能这么用,非常顺手:
[TestMethod] public async Task IndexPost_ReturnsBadRequestResult_WhenModelStateIsInvalid() { // Arrange & Act 代码同上... // Assert var badRequestResult = AssertExtensions.IsType<BadRequestObjectResult>(result); // 继续你的后续断言逻辑 }
最后提个小细节:MS Test的测试方法需要标记[TestMethod]特性,而不是xUnit的[Fact],如果是从xUnit迁移过来的话别忘了替换这个哦~
内容的提问来源于stack exchange,提问作者spottedmahn
相关产品推荐
相关产品推荐

