首页 > 解决方案 > xUnit.net IsType 在返回类型的 MS 测试中等效

问题描述

我正在遵循本指南,并且正在尝试使用 MS Test 编写类似的测试。MS Test 是否有一个在转换成功IsType()返回对象的对象

这个比较中,我看到我可以使用IsInstanceOfType()但返回类型是void.


我正在尝试在 MS Test 中实现这一行: var badRequestResult = Assert.IsType<BadRequestObjectResult>(result);

[Fact]
public async Task IndexPost_ReturnsBadRequestResult_WhenModelStateIsInvalid()
{
    // Arrange
    var mockRepo = new Mock<IBrainstormSessionRepository>();
    mockRepo.Setup(repo => repo.ListAsync()).Returns(Task.FromResult(GetTestSessions()));
    var controller = new HomeController(mockRepo.Object);
    controller.ModelState.AddModelError("SessionName", "Required");
    var newSession = new HomeController.NewSessionModel();

    // Act
    var result = await controller.Index(newSession);

    // Assert
    var badRequestResult = Assert.IsType<BadRequestObjectResult>(result);
    Assert.IsType<SerializableError>(badRequestResult.Value);
}

是的,我可以使用as然后使用IsInstanceOfType......只是想知道是否有单线。

var badRequestResult = result as BadRequestObjectResult;
Assert.IsInstanceOfType(badRequestResult, typeof(BadRequestObjectResult));

参考:添加到 MSTest 请求

标签: c#mstestxunit.net

解决方案


MSTest 中没有我遇到过的等效版本。

如果进行强制转换,则无需检查实例是否属于类型。只需检查它是否不为空。

// Act
var result = await controller.Index(newSession);

// Assert
var badRequestResult = result as BadRequestObjectResult;
Assert.IsNotNull(badRequestResult, "Expected BadRequestObjectResult");
Assert.IsInstanceOfType(badRequestResult.Value, typeof(SerializableError));

否则,您可以创建自己的断言

public static class AssertExtension {
    public static TExpected AssertIsType<TExpected>(this object actual, string message = null) 
        where TExpected : class {
        TExpected result = actual as TExpected;
        Assert.IsNotNull(result, message);
        return result;
    }
}

提供所需的行为

// Assert
var badRequestResult = result.AssertIsType<BadRequestObjectResult>();
badRequestResult.Value.AssertIsType<SerializableError>();

推荐阅读