我正在尝试测试我的控制器,该控制器用于注册新用户。
[HttpPost]
public ActionResult Register(ClientViewModel clientViewModel)
{
if (ModelState.IsValid)
{
var client = new Client
{
//filling object from clientViewModel
};
var license = new License
{
//filling object from clientViewModel
};
if (AccountFacade.AddClientLicense(client, license))
{
var licenseId = AccountFacade.GetLicenseIdForUsername(Applications.UBetPro, clientViewModel.UserName);
if (licenseId.HasValue)
{
AccountFacade.AddAccount(licenseId.Value);
return RedirectToAction("RegisterSuccess");
}
}
}
return View(clientViewModel);
}
这不是整个代码,但我认为这是与测试相关的唯一部分。添加和验证的方法是从业务逻辑中的外观调用的,在单元测试中模拟它及其所有方法。 控制器应该将用户重定向到注册成功时显示的表单,这就是我要测试的内容。这是我的单元测试:
public void Register_WithUniqueUsernameAndEmail_ReturnsRegistrationSuccessful()
{
// Arrange:
var mock = new Mock<IAccountFacade>();
mock.Setup(/*mocking methods*/);
var controller = new AccountController(mock.Object);
var context = new ControllerContext();
var fakeClientViewModel = new ClientViewModel
{
FirstName = "test",
...
...
};
// Act:
var result = controller.Register(fakeClientViewModel);
// how do I get the name of result or something similar?
// Assert: ???
}
我正在使用Moq和Structure Map进行单元测试。方法设置工作正常,唯一的问题是我无法访问特定于结果字段的东西,我能够识别它并在Assert部分中使用它。如果模型使用View(“RegisterSuccess”),我猜不会有任何问题,但从我能看到的RedirectToAction不是那么容易访问。如果有一个不同于我试图使用的解决方案的解决方案,我很乐意尝试一下。
答案 0 :(得分:0)
您需要将结果转换为ActionResult或RedirectResult,具体取决于您正在测试的代码部分
var result = controller.Register(fakeClientViewModel) as ActionResult;
完成此操作后,您可以查看视图名称,模型数据等
答案 1 :(得分:0)
知道了。
var result = (RedirectToRouteResult)controller.Register(fakeClientViewModel);
Assert.AreEqual("RegisterSuccess", result.RouteValues["action"]);