1

我正在寻找对我的 MVC 3 控制器进行单元测试的最佳方法。我正在考虑在使用一堆不同的参数执行控制器操作时获取 viewresult 的结果,将其序列化并保存到文件作为未来测试的基础。

2个问题:

  1. 这是一个坏主意吗?对于以前的应用程序,这似乎是检查更改是否破坏任何东西的最安全方法之一。我可以反序列化我存储的结果,进行任何必要的更改,然后与实时结果进行比较。
  2. 如果它是一种很好的测试方式,我该如何序列化视图结果?在下面的代码中,我收到了 ActionResult 无法序列化的错误。
//create viewresult to return to view
ActionResult viewResult = View(dv);

//save viewresult for future unit test comparisons.
//Save data as name of controller action and param value used
string fileName = logDir + "\\" + controllerActionName + tradeDate.ToString("MMddyyyy") + ".viewresult";

//serialze and save to file
System.IO.Stream stream = System.IO.File.Open(fileName,System.IO.FileMode.Create);
System.Runtime.Serialization.Formatters.Binary.BinaryFormatter bFormatter = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
bFormatter.Serialize(stream, viewResult);
stream.Close();

//send viewresult to mvc3 view
return viewResult;
4

1 回答 1

0

测试控制器操作的最简单方法是检查视图模型。您真的不需要将内容写到文件等中。

你可以做类似的事情

给定一个动作:

public ViewResult AddNewDocument(int documentFolderId)
    {
        var documentFolder = documentFolderRepository.Get(documentFolderId);

        return View("AddNewDocument",
                    new AddNewDocumentView { DocumentFolderId = documentFolder.Id, DocumentFolderName = documentFolder.Name });
    }

编写一个单元测试(在 mspec 中,尽管 NUnit 或 MSTest 也是如此:

public class when_AddNewDocument_GET_is_requested : given_a_DocumentController
{
    Because of = () => result = documentController.AddNewDocument(documentFolderId);

    It should_return_a_view_result_with_the_view_name_AddDocument = () => result.ViewName.ShouldEqual("AddNewDocument");

    It should_have_a_view_model_of_type_AddNewDocumentView = () => result.ViewData.Model.ShouldBeOfType<AddNewDocumentView>();
    It should_have_return_document_folder_id_in_view_model = () => ((AddNewDocumentView)result.ViewData.Model).DocumentFolderId.ShouldEqual(documentFolderId);
    It should_have_return_document_folder_name_in_view_model = () => ((AddNewDocumentView)result.ViewData.Model).DocumentFolderName.ShouldEqual(documentFolderName);

    static ViewResult result;
}

关键是您传递给视图的视图模型包含您需要测试的所有数据。这可以直接从 result.ViewData.Model 中获取。

于 2012-06-19T16:22:07.193 回答