Asp.net mvc 3 MVC3中从字符串到System.Web.Mvc.ViewResult的转换错误

Asp.net mvc 3 MVC3中从字符串到System.Web.Mvc.ViewResult的转换错误,asp.net-mvc-3,Asp.net Mvc 3,大家好,我是MVC的新手,我正在尝试创建一个从华氏到摄氏的简单转换,以及它的单元测试。很抱歉把所有的代码放在这里 这是我的控制器代码: public string Convert(double value,string option) { string d; if(option=="1") { d = " To Celcius"+FahrenheitToCelsius(value).ToString(); } else { d =

大家好,我是MVC的新手,我正在尝试创建一个从华氏到摄氏的简单转换,以及它的单元测试。很抱歉把所有的代码放在这里

这是我的控制器代码:

public string Convert(double value,string option)
{
    string d;

    if(option=="1") {
        d = " To Celcius"+FahrenheitToCelsius(value).ToString();
    }
    else {
        d = " To Fahrenheit" + CelsiusToFahrenheit(value).ToString();
    }
    return "ConvertTo" + d;
}

public static double CelsiusToFahrenheit(double temperatureCelsius)
{
    double celsius = temperatureCelsius;
    return (celsius * 9 / 5) + 32;
}

public static double FahrenheitToCelsius (double temperatureFahrenheit)
{
    double fahrenheit = temperatureFahrenheit;
    return (fahrenheit - 32) * 5 / 9;
}
这是我的查看页面

protected void btnConvert(object sender, EventArgs e)
{
    if (DropDownList1.SelectedValue=="1"){
        double temp = TemperatureConverterController.FahrenheitToCelsius(double.Parse(TextBox1.Text));
        Literal1.Text = temp.ToString();
    }
    else{
        double temp = TemperatureConverterController.CelsiusToFahrenheit(double.Parse(TextBox1.Text));
        Literal1.Text = temp.ToString();
        Literal1.Text = temp.ToString();
    }
}
当我进行单元测试时,我得到一个错误:

[TestMethod]
public void ConvertReturnsAViewResultWhenInputDataIsValid()
{
    //Arrange
    var controller = new TemperatureConverterController();

    //Act
    double x = 80;
    double y = 25;
    var result = controller.Convert(x, "1") as ViewResult;
    //    here i get this error under ViewResult //

    //Assert
    Assert.IsInstanceOfType(result, typeof(ViewResult));
}

[TestMethod]
public void ConvertAsksForAViewTemplateNamedConvert()
{
    //Arrange
    var controller = new TemperatureConverterController();
    String expectedViewTemplate = "Convert";

    //Act
    double x = 80;
    double y = 25;
    var result = controller.Convert(x, "1") as ViewResult;
    ////Assert
    Assert.AreEqual<String>(expectedViewTemplate, result.ViewName);
}

在MVC中,控制器代码应该返回一个包含模型的“ActionResult”对象

如果要传递给视图的数据只是字符串,请使用:

public ActionResult Convert()
{
    //...
    return View("your result here...");
}

您可以在视图或测试中使用“Model”属性引用控制器返回的数据。

在MVC中,控制器代码应返回包含模型的“ActionResult”对象

如果要传递给视图的数据只是字符串,请使用:

public ActionResult Convert()
{
    //...
    return View("your result here...");
}
您可以在视图或测试中使用“Model”属性引用控制器返回的数据。

问题就在这里

var result = controller.Convert(x, "1") as ViewResult;
Convert方法返回字符串,并将其转换为ViewResult

您的convert方法应该如下所示

public ActionResult Convert()
{
    //Make a Model class and pass it to View
    //...
    return View(model_class_object);
}
或者,您也可以这样制作控制器

public ActionResult Convert()
{
    ViewData["tempvalue"]=Convert(x, "1");
    //Make a Model class and pass it to View
    //...
    return View();
}
在您的视图上,您可以打印它

@ViewData["tempvalue"].ToString()
问题就在这里

var result = controller.Convert(x, "1") as ViewResult;
Convert方法返回字符串,并将其转换为ViewResult

您的convert方法应该如下所示

public ActionResult Convert()
{
    //Make a Model class and pass it to View
    //...
    return View(model_class_object);
}
或者,您也可以这样制作控制器

public ActionResult Convert()
{
    ViewData["tempvalue"]=Convert(x, "1");
    //Make a Model class and pass it to View
    //...
    return View();
}
在您的视图上,您可以打印它

@ViewData["tempvalue"].ToString()

让我们往后退一分钟

控制器

public class ConvertController : Controller
{
    public ActionResult Convert(MyConvertViewModel vm)
    {
        if (vm == null) { return View("convert", new MyConvertViewModel { ShowResult = false }); }

        if (vm.Option == 1)
        {
            vm.Result = FahrenheitToCelsius(vm.Input);
            vm.OptionName = "Fahrenheit To Celsius";
        }
        else
        {
            vm.Result = CelsiusToFahrenheit(vm.Input);
            vm.OptionName = "Celsius to Fahrenheit";
        }
        vm.ShowResult = true;

        //not needed, just for an example
        ViewData.Add("glosrob-example", "A value goes here!");

        return View("convert", vm);
    }

    private static double CelsiusToFahrenheit(double temperatureCelsius)
    {
        double celsius = temperatureCelsius;
        return (celsius * 9 / 5) + 32;
    }

    private static double FahrenheitToCelsius(double temperatureFahrenheit)
    {
        double fahrenheit = temperatureFahrenheit;
        return (fahrenheit - 32)*5/9;
    }
}

public class MyConvertViewModel
{
    public double Result { get; set; }
    public int Option { get; set; }
    public double Input { get; set; }
    public string OptionName { get; set; }
    public bool ShowResult { get; set; }
}
看法

希望这能让您了解如何测试控制器方法的输出

编辑:我不是为你写所有的测试,而是作为一个例子

[TestMethod]
public void Convert_Should_Return_A_MyConvertViewModel()
{
    //arrange
    var c = new Controller();

    //act
    var result = c.Convert(null) as ViewResult;

    //assert
    Assert.IsNotNull(result);
    Assert.IsInstanceOfType(result.ViewModel, typeof(MyConvertViewModel));
}

[TestMethod]
public void Convert_Should_Return_The_Correct_View()
{
    //arrange
    var c = new Controller();

    //act
    var result = c.Convert(null) as ViewResult;

    //assert
    Assert.IsNotNull(result);
    Assert.AreEqual("convert", result.ViewName);
}

让我们往后退一分钟

控制器

public class ConvertController : Controller
{
    public ActionResult Convert(MyConvertViewModel vm)
    {
        if (vm == null) { return View("convert", new MyConvertViewModel { ShowResult = false }); }

        if (vm.Option == 1)
        {
            vm.Result = FahrenheitToCelsius(vm.Input);
            vm.OptionName = "Fahrenheit To Celsius";
        }
        else
        {
            vm.Result = CelsiusToFahrenheit(vm.Input);
            vm.OptionName = "Celsius to Fahrenheit";
        }
        vm.ShowResult = true;

        //not needed, just for an example
        ViewData.Add("glosrob-example", "A value goes here!");

        return View("convert", vm);
    }

    private static double CelsiusToFahrenheit(double temperatureCelsius)
    {
        double celsius = temperatureCelsius;
        return (celsius * 9 / 5) + 32;
    }

    private static double FahrenheitToCelsius(double temperatureFahrenheit)
    {
        double fahrenheit = temperatureFahrenheit;
        return (fahrenheit - 32)*5/9;
    }
}

public class MyConvertViewModel
{
    public double Result { get; set; }
    public int Option { get; set; }
    public double Input { get; set; }
    public string OptionName { get; set; }
    public bool ShowResult { get; set; }
}
看法

希望这能让您了解如何测试控制器方法的输出

编辑:我不是为你写所有的测试,而是作为一个例子

[TestMethod]
public void Convert_Should_Return_A_MyConvertViewModel()
{
    //arrange
    var c = new Controller();

    //act
    var result = c.Convert(null) as ViewResult;

    //assert
    Assert.IsNotNull(result);
    Assert.IsInstanceOfType(result.ViewModel, typeof(MyConvertViewModel));
}

[TestMethod]
public void Convert_Should_Return_The_Correct_View()
{
    //arrange
    var c = new Controller();

    //act
    var result = c.Convert(null) as ViewResult;

    //assert
    Assert.IsNotNull(result);
    Assert.AreEqual("convert", result.ViewName);
}

对于建议,它确实消除了错误,但仍然没有通过测试。这是测试结果-Assert.IsTrue失败。我不在机器上检查,但应该是视图(“viewname”,“您的结果在这里…”)-否则它会将结果解释为视图名称是的,您是对的。默认视图名称是方法的名称,因此您可以忽略它。对于建议,它确实会删除错误,但测试仍然失败。这是测试结果-Assert.IsTrue失败。我不在机器上检查,但应该是视图(“viewname”,“您的结果在这里…”)-否则它会将结果解释为视图名称是的,您是对的。默认视图名称是方法的名称,因此您可以忽略它。它适用于视图测试,但此测试失败:[TestMethod]public void ConvertAddStemTemperaturePropertyTotheViewBag(){var controller=new TemperatureConverterController());双温=77d;字符串convertTo=“fahrenheit”;字符串expectedViewDataKey=“temperature”;var result=controller.Convert(温度,“1”)作为ViewResult;Assert.IsTrue(result.ViewData.Keys.Contains(expectedViewDataKey))}确实如此,但是您没有向ViewData集合添加任何内容,也没有在您的原始版本或我的修改版本中添加任何内容。控制器操作应该做什么?用户提供了什么,以及他们应该期望的结果是什么?控制器操作应该进行转换,用户将从下拉列表中提供转换选项以及值和期望转换值。但我对此有点困惑,因为在测试方法中,assert check for ViewData.Keys正在查找字符串值。它不应该寻找双转换值吗?好的,给我几分钟,我想我可以看到这里的问题,但我没有通过测试。它给了我Assert.Fail.Failed错误。实际上,我根本没有想到要测试这个部分。它适用于视图测试,但此测试失败:[TestMethod]public void ConvertAddsTemperaturePropertyToTheViewBag(){var controller=new TemperatureConverterController();双温=77d;字符串convertTo=“fahrenheit”;字符串expectedViewDataKey=“temperature”;var result=controller.Convert(温度,“1”)作为ViewResult;Assert.IsTrue(result.ViewData.Keys.Contains(expectedViewDataKey))}确实如此,但是您没有向ViewData集合添加任何内容,也没有在您的原始版本或我的修改版本中添加任何内容。控制器操作应该做什么?用户提供了什么,以及他们应该期望的结果是什么?控制器操作应该进行转换,用户将从下拉列表中提供转换选项以及值和期望转换值。但我对此有点困惑,因为在测试方法中,assert check for ViewData.Keys正在查找字符串值。它不应该寻找双转换值吗?好的,给我几分钟,我想我可以看到这里的问题,但我没有通过测试。它给了我Assert.Fail.Failed错误。事实上,我根本就没想到要测试这个部件。