1

こんにちは、私は 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);
}

エラーは次のとおりです。

Error   Cannot convert type 'string' to 'System.Web.Mvc.ViewResult' via a reference conversion, boxing conversion, unboxing conversion, wrapping conversion, or null type conversion.
4

3 に答える 3

2

問題はここにあります

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()
于 2013-01-17T12:56:01.727 に答える
0

MVC では、コントローラー コードはモデルを含む「ActionResult」オブジェクトを返す必要があります。

ビューに渡したいデータが単なる文字列の場合:

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

ビューまたはテストの「モデル」プロパティを使用して、コントローラーから返されたデータを参照できます。

于 2013-01-17T12:54:07.030 に答える
-1

ここで、1 分前に戻りましょう。

コントローラ

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; }
}

意見

@model MvcApplication1.Controllers.MyConvertViewModel
@{
    ViewBag.Title = "Convert";
}
<h2>Convert</h2>

@using (Html.BeginForm("convert", "convert", FormMethod.Post))
{
 <div>
     Let's convert some temperatures!
 </div>
 <div>
     @Html.LabelFor(x => x.Input, "Temp. To Convert")
     @Html.TextBoxFor(x => x.Input)
 </div>
 <div>
     @Html.LabelFor(x => x.Option, "Convert to ")
     @Html.DropDownListFor(x => x.Option, new List<SelectListItem>
     {
         new SelectListItem {Text = "Celsius", Value = "1"},
         new SelectListItem {Text = "Fahrenheit", Value = "2"}
     })
 </div>
 <div>
     <button type="submit">Convert It!</button>
 </div>
}
@if (Model.ShowResult)
{
    <p>@Model.OptionName : @Model.Input = @Model.Result</p>
}

免責事項: そこにはたくさんのショートカットがあります。これは、何を持っているべきかを理解するためだけに含まれています。

したがって、ビューはユーザーが選択したデータをコントローラーアクションにポストバックしますConvert

次に、コントローラーは ViewResult オブジェクトを返し、ビューモデルでキャプチャされたデータを使用してレンダリングされますMyConvertViewModel

これをテストします。

フックする必要があると思われる、より重要なプロパティのいくつかを次に示します。

[TestMethod]
public void Not_A_Real_Test_But_Stuff_You_Will_Want_To_Use()
{
    //arrange
    var c = new ConvertController();

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

    //now results is a ViewResult or null

    var theViewModelProperty = results.Model as MyConvertViewModel;
    var exampleResult = theViewModelProperty.Result;
    var exampleInput = theViewModelProperty.Input;

    //etc

    //how about the view that was returned?
    var theViewName = results.ViewName;

    //or anything you put in the ViewData
    var theViewData = results.ViewData["glosrob-example"];

    Assert.Fail("This was not a real test!");
}

これにより、コントローラー メソッドからの出力をテストする方法が理解できると思います。

編集:私はあなたのためにすべてのテストを書いているわけではありませんが、例として

[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);
}
于 2013-01-17T13:30:27.830 に答える