1

MVC 3 コントローラーを単体テストするための最良の方法を検討しています。一連の異なるパラメーターを使用してコントローラーアクションを実行し、それをシリアル化し、将来のテストのベースとしてファイルに保存することで、viewresult の結果を取得することを考えていました。

2 つの質問:

  1. これは悪い考えですか?以前のアプリケーションでは、これは、変更によって何も壊れていないことを確認する最も安全な方法の 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 });
    }

(同じことが NUnit または MSTest にも当てはまりますが、mspec で単体テストを記述します。

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 に答える