2011-12-19 15 views
14

ASP.NET MVCアプリケーションのコントローラは、かなり単純なフォワードルールに従って、ビューで表示されるフォームデータをあらかじめ設定しています。ユニットテストMVCコントローラ

これは私のユニットテストでカバーするのが良いことだと思われます。しかし、正しいデータを検証するために私が見ることができる唯一の方法は、コントローラから論理を抽出して不自然な感じにすることです。

誰かがこれにアプローチする方法を提案できますか?

ユニットテストコントローラーのすべての例は、予想されるタイプのビューを返したことを確認するなど、非常に些細なようでした。私はそれでも価値があるとは確信していません。

答えて

21

あなたは代わりにデフォルトをテストするために、例えば、(デフォルトで返されます)、その基底クラス

を使用してAccountControllerあなたがしたいので、このような何かをの、適切なクラスに返されたオブジェクトをキャストすることによってテストすることができます。返されたオブジェクトが正しいデータで満たされているかどうかの確認

var controller = new AccountController(); 
var result = controller.LogOn() as ViewResult; 
var model = result.Model as LogOnModel; 

Assert.IsTrue(model.RememberMe); // assuming you "pre-populated" enabled the checkbox 

は私に「不自然」は思えない、またはあなたが異なり、それを意味したのですか?

+1

ああ... 'result.Model'が便利になります。 –

11

返されるビューのタイプをテストすることはやや意味がないことに同意します。しかし、期待される「ビュー」が正しいデータと共に返されることをテストすることは、有効なテストケースIMOになります。

たとえば、ここでは編集コントローラのための単体編集テストケースがあります。この例ではMoqとNunitを使用していますが、それはかなり単純です。

ViewResultは予想されるビューモデルにキャストされ、アサーションは予想される連絡先に対して行われることに注意してください。

テスト:

[Test] 
public void Edit_Get_Should_Lookup_Contact_From_Repository_And_Return_Edit_View() 
{ 
    // arrange 
    var _repository = new Mock<IContactRepository>(); 

    var expectedContact = new Contact 
    { 
     First = "first", 
     Last = "last", 
     Email = "[email protected]" 
    }; 

    var mockContext = new Mock<ControllerContext>(); 
    _repository.Setup(x => x.GetById(It.IsAny<int>())).Returns(expectedContact); 

    var controller = new ContactController(_repository.Object) 
    { 
     ControllerContext = mockContext.Object 
    }; 

    // act 
    var result = controller.Edit(1) as ViewResult; 
    var resultData = (Contact)result.ViewData.Model; 

    // assert 
    Assert.AreEqual("Edit", result.ViewName); 
    Assert.AreEqual(expectedContact.First, resultData.First); 
    Assert.AreEqual(expectedContact.Last, resultData.Last); 
    Assert.AreEqual(expectedContact.Email, resultData.Email); 
} 

コントローラー:

[HttpGet] 
public ActionResult Edit(int id) 
{ 
    var contact = _repository.GetById(id); 

    return View("Edit", contact); 
} 
関連する問題