【问题标题】:Getting error cannot convert type actionresult to viewresult in unit testing在单元测试中出现错误无法将类型 actionresult 转换为 viewresult
【发布时间】:2014-09-08 06:18:45
【问题描述】:

我正在 MVC 5 中创建一个测试项目。

我遇到错误

Error 1 Cannot convert type 'System.Threading.Tasks.Task<System.Web.Mvc.ActionResult>' to 'System.Web.Mvc.ViewResult' via a reference conversion, boxing conversion, unboxing conversion, wrapping conversion, or null type conversion

这是我的代码:

[TestMethod]
    public void LoginTest()
    {

        // Arrange
        Mock<IAccountService<ApplicationUser>> membership = new Mock<IAccountService<ApplicationUser>>();

        var logonModel = new LoginViewModel() { UserName = null, Password = null };
        obj = new AccountController();

        // Act
        ViewResult result = obj.Login(logonModel,"") as ViewResult;

        // Assert
        Assert.AreEqual(result.ViewName, "Index");
        Assert.IsFalse(obj.ModelState.IsValid);
        Assert.AreEqual(obj.ModelState[""],"The user name or password provided is incorrect.");
    }

我正在测试我的控制器操作

 public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)
    {
        if (ModelState.IsValid)
        {
            var user = await _accountService.FindAsync(model.UserName, model.Password);

            if (user != null )
            {
                    await SignInAsync(user, model.RememberMe);
                    return RedirectToLocal(returnUrl);
            }
            else
            {
                ModelState.AddModelError("", "Invalid username or password.");
            }
        }
        return View(model);
    }

编辑:我在这一行 obj.Login(loginviewmodel,"") as ViewResult 的测试方法中遇到错误,因为登录操作返回 Task&lt;ActionResult&gt; 类型,我将其转换为 ViewResult

如何解决这个错误?

【问题讨论】:

  • 它不起作用,因为我正在使用没有 async 关键字的 testmethod 测试 async 方法。当我的 Login 方法返回 Task 时,我必须将我的测试方法的返回类型设置为 Task 后跟 async 关键字并使用 await 关键字调用该方法。它有效。
  • 您能否使用您使用的代码以答案的形式提出您的解决方案?我遇到了同样的问题。
  • @BrendanHannemann 你可以查看我的答案

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


【解决方案1】:
    [TestMethod]
    public async Task Login_Test()
    {
        // Arrange
        var logonModel = new LoginViewModel() { UserName = "Admin", Password = "admin123" };

        // Validate model state start
        var validationContext = new ValidationContext(logonModel, null, null);
        var validationResults = new List<ValidationResult>();

        //set validateAllProperties to true to validate all properties; if false, only required attributes are validated.
        Validator.TryValidateObject(logonModel, validationContext, validationResults, true);
        foreach (var validationResult in validationResults)
        {
            controller.ModelState.AddModelError(validationResult.MemberNames.First(), validationResult.ErrorMessage);
        }
        // Validate model state end


        // Act

        var result = await controller.Login(logonModel, null) as RedirectToRouteResult;

        // Assert
        Assert.AreEqual("Index", result.RouteValues["action"]);
        Assert.AreEqual("Home", result.RouteValues["controller"]);
    }

这是我的问题的解决方案。它适用于异步方法。您必须将操作的返回类型更改为async Task 并调用await 关键字后跟的方法。

要使用验证方法,请为 System.ComponentModel.DataAnnotations 添加 using 语句

【讨论】:

猜你喜欢
  • 2017-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-27
相关资源
最近更新 更多