Asp.net mvc 3 MVC3中从字符串到System.Web.Mvc.ViewResult的转换错误
大家好,我是MVC的新手,我正在尝试创建一个从华氏到摄氏的简单转换,以及它的单元测试。很抱歉把所有的代码放在这里 这是我的控制器代码: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 =
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错误。事实上,我根本就没想到要测试这个部件。