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