Asp.net mvc 3 使用序列化viewresult的mvc3单元测试最佳实践
我正在寻找对MVC3控制器进行单元测试的最佳方法。 我正在考虑在使用一组不同的参数执行控制器操作时获取viewresult的结果,将其序列化并保存到文件中,作为将来测试的基础 2个问题:Asp.net mvc 3 使用序列化viewresult的mvc3单元测试最佳实践,asp.net-mvc-3,testing,serialization,viewresult,Asp.net Mvc 3,Testing,Serialization,Viewresult,我正在寻找对MVC3控制器进行单元测试的最佳方法。 我正在考虑在使用一组不同的参数执行控制器操作时获取viewresult的结果,将其序列化并保存到文件中,作为将来测试的基础 2个问题: 这是个坏主意吗?对于以前的应用程序,这似乎是检查更改是否未破坏任何内容的最安全方法之一。我可以反序列化存储的结果,进行任何必要的更改,然后与实时结果进行比较 如果这是一种很好的测试方法,如何序列化viewresult?在下面的代码中,我得到一个错误,ActionResult无法序列化 测试控制器操作的最简单方法
测试控制器操作的最简单方法是检查视图模型。 您真的不需要将内容写入文件等 你可以这样做 鉴于以下行为:
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=documentController.AddNewDocument(documentFolderId);
它应该返回一个带有视图名称的视图结果,AddDocument=()=>result.ViewName.ShouldEqual(“AddNewDocument”);
它应该具有类型为的视图模型,添加新文档视图=()=>result.ViewData.model.ShouldBeOfType();
它应该在视图中有返回文档文件夹id(模型=()=>((AddNewDocumentView)result.ViewData.model)。DocumentFolderId.ShouldEqual(DocumentFolderId);
它应该在视图中有返回文档文件夹名称模型=()=>((AddNewDocumentView)result.ViewData.model).DocumentFolderName.ShouldEqual(DocumentFolderName);
静态视图结果;
}
该点是传递给视图的viewmodel,其中包含需要测试的所有数据。可以直接从result.ViewData.Model获取这些数据
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;
}