【问题标题】:testing IActionResult content within vnext application在 vnext 应用程序中测试 IActionResult 内容
【发布时间】:2016-05-10 08:11:27
【问题描述】:

我有一个 vnext 应用程序,我在其中添加了此操作:

[RoutePrefix("api/[controller]")]
public class AccountController : BaseController
{
    public IActionResult generatePasswd(int length)
    {
        throw new NotImplementedException();
    }
}

我添加了一个简单的单元测试来测试这个动作:

[Test]
public void GeneratePasswd_PasswdLength_NewPasswd()
{
    var mockNotifier = new Mock<INotifier>();
    var mockPaswordGenerator = new Mock<IPasswdGenerator>();

    AccountController AccMgr = new AccountController(mockNotifier.Object, mockPaswordGenerator.Object);

    int length = 0;

    IActionResult passwd = AccMgr.generatePasswd(length);

    Assert.IsTrue(passwd is HttpOkResult);     
}

如果IActionResult 响应,我想测试内容:例如测试它的长度是否不为零。我该怎么做?

【问题讨论】:

    标签: c# asp.net .net unit-testing asp.net-core


    【解决方案1】:

    您可以验证返回的接口是否属于某种类型,然后将其转换为所述类型,并断言您期望从中获得的其他特征。考虑以下几点:

    [Test]
    public void GeneratePasswd_PasswdLength_NewPasswd()
    {
        var mockNotifier = new Mock<INotifier>();
        var mockPaswordGenerator = new Mock<IPasswdGenerator>();
    
        var accMgr = new AccountController(mockNotifier.Object, mockPaswordGenerator.Object);
    
        IActionResult result = accMgr.generatePasswd(length);
    
        Assert.IsInstanceOfType(result , typeof(OkResult));    
    }
    

    这是一个类似的SO Q & A。如果您返回的是一个视图 IActionResult,那么您可以获取模型并对其执行断言:

    var vResult = result as ViewResult;
    if(vResult != null)
    {
        Assert.IsInstanceOfType(vResult.Model, typeof(YourModelType));
        var model = vResult.Model as YourModelType;
        if (model != null)
        {
            //...
        }
    }
    

    更新

    按照official documentation,你可以这样做:

    var result = Assert.IsType<HttpOkObjectResult>(controller.generatePasswd(length));
    var password = Assert.IsType<string>(result.Value);
    

    然后假设您的 API 实现如下所示:

    [Route("api/[controller]")]
    public class AccountController : BaseController
    {
        public IActionResult generatePasswd(int length)
        {
            // Where the generateImpl returns a string.
            return Ok(generateImpl(length));
        }
    }
    

    【讨论】:

    • 感谢您的回答,但我需要知道该操作是否返回视图以外的类型(如上一版本中的 Web api 控制器操作)。如何获取其值。例如如果返回值是字符串,我需要得到它的长度?
    • 这里有一篇很好的关于测试控制器的文章,前半部分是MVC视图,但后半部分是Web API测试docs.asp.net/en/latest/mvc/controllers/testing.html
    猜你喜欢
    • 2018-06-24
    • 2018-03-07
    • 2015-02-12
    • 1970-01-01
    • 1970-01-01
    • 2015-10-26
    • 1970-01-01
    • 1970-01-01
    • 2020-10-09
    相关资源
    最近更新 更多