在vnext应用程序中测试IActionResult内容

时间:2016-05-10 08:11:28

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

我有一个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响应:例如测试其长度是否为零。我怎么能这样做?

1 个答案:

答案 0 :(得分:2)

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

[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));
    }
}