c# - 无法使用 xunit 测试 mvc.controller 检查 returnType 是否为 HttpNotFoundResult

标签 c# asp.net-mvc unit-testing testing xunit

我正在尝试测试 Microsoft.AspNet.Mvc.Controller返回 Task<IActionResult>如果传入的 id 被命中,并返回 HttpNotFound()如果没有命中。

我如何使用 xUnit 测试我返回的是 HttpNotFound 还是实际结果?

这是 Controller 方法:

[HttpGet("{id}")]
public async Task<IActionResult> Get(string id)
{
    var company = await _repository.GetSingle(id);
    if (company == null)
        return HttpNotFound();

    return new ObjectResult(company);
}

这是测试方法(不起作用):

[Theory]
[InlineData("1")]
[InlineData("01")]
[InlineData("10")]
public async void TestGetSingleNonExistingCompany(string id)
{
    var controller = new CompanyController(new CompanyRepositoryMock());
    try
    {
        var res = await controller.Get(id);
        Assert.False(true);
    }
    catch (Exception e)
    {
        Assert.True(true);
    }
}

我猜问题是 controller.Get(id)实际上并没有抛出 Exception , 但我不能使用 typeOf , 因为 res 的类型变量是在编译时决定的,而不是运行时。

运行 Assert.IsType 时:

[Theory]
[InlineData("1")]
[InlineData("01")]
[InlineData("10")]
public async void TestGetSingleNonExistingCompany(string id)
{
    var controller = new CompanyController(new CompanyRepositoryMock());
    var res = await controller.Get(id);
    Assert.IsType(typeof (HttpNotFoundResult), res.GetType());
}

我收到这条消息:

Assert.IsType() Failure
Expected: Microsoft.AspNet.Mvc.HttpNotFoundResult
Actual:   System.RuntimeType

有什么想法吗?

最佳答案

Assert.IsType的第二个参数应该是您正在检查其类型而不是对象类型的对象本身。试试这个,当返回 HttpNotFound() 的结果时,您的断言应该成功:

Assert.IsType(typeof (HttpNotFoundResult), res);

关于c# - 无法使用 xunit 测试 mvc.controller 检查 returnType 是否为 HttpNotFoundResult,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35066268/

相关文章:

visual-studio - 导入Visual Studio测试项目时如何创建vsmdi/testrunco​​nfig文件?

api - 模拟每个领域或好的 api

c# - 如何在没有显式引用的情况下访问打开的 DbContext?

c# - Parallel.ForEach(...) 内的 System.Drawing 内存泄漏

javascript - 远程 css 背景图像未加载

asp.net-mvc - 如何将客户类对象数据存储到 Redis 缓存中?

asp.net - EF6(代码优先)、MVC、Unity 和没有存储库的服务层

java - 如何使用junit模拟调用单例类的类

c# - 将 NLog 与 NServiceBus 3 一起使用

c# - 从 dataGridView 到 TextBox,取 headername