2009-07-30 6 views
6

MOQフレームワークを試していますが、今は障壁があります。 ViewNameプロパティの実際の値が空の文字列であるため、次の単体テストが失敗します。moqでコントローラのコンテキストをモックする方法

誰かが正しい方向に私を指すことができますか?なぜこれがテストに合格していないのですか?

[TestMethod] 
public void Can_Navigate_To_About_Page() 
{ 
    var request = new Mock<HttpRequestBase>(); 
    request.Setup(r => r.HttpMethod).Returns("GET"); 
    var mockHttpContext = new Mock<HttpContextBase>(); 
    mockHttpContext.Setup(c => c.Request).Returns(request.Object); 

    var controllerContext = new ControllerContext(mockHttpContext.Object, 
           new RouteData(), 
           new Mock<ControllerBase>().Object); 
    var controller = new HomeController(); 

    controller.ControllerContext = controllerContext; 
    var result = controller.About() as ViewResult; 

    Assert.AreEqual("About", result.ViewName); 
} 

次に、空のViewNameも表示されます。私は上記の最初のユニットテストの例の作業のいずれかを行う必要があり、他のどのような配管にとしてだけで混乱していますモックも良いTTD実証し、ウェブ上の例から

 HomeController controller = new HomeController(); 
     ViewResult result = controller.About() as ViewResult; 
     Assert.IsNotNull(result); 
     Assert.AreEqual("About", result.ViewName); 

。あなたが明示的に指定していないときVIEWNAMEを決定することは、フレームワークの深さにあるので

乾杯、

アンドリュー

答えて

7

テストが失敗した理由があります。より正確にはビューエンジンで私は信じています。したがって、これをテストするためには、リクエストパイプラインをさらに徹底的に掘り下げなければなりません。

私は何を、とお勧めします、デフォルトに依存して明示的にビューを指定しないことです。

return View("About"); 

そして、値が何かをからかっせずにテストすることがあるでしょう:

var controller = new HomeController(); 
var result = controller.About() as ViewResult; 
Assert.AreEqual("About", result.ViewName); 
+0

ありがとうございました、メソッドのシグネチャの1つがView(文字列viewName、オブジェクトモデル)であることを確認した後で、あなたのポイントは完璧な意味を持ちます! P.S.テストは合格! :-) –

3

これは、MVCフレームワークの仕組みを前提としているためです。ビューを見つけるために慣習に頼っている場合、フレームワークはExecuteResult()が呼び出されるまで実際にはViewNameプロパティをString.Emptyのままにします。

あなたはthe MVC sourceViewResultBase.ExecuteResultのライン68上でこのコードを見ることができます:

if (String.IsNullOrEmpty(ViewName)) { 
    ViewName = context.RouteData.GetRequiredString("action"); 
} 

さらに、あなたがテストしているかについて注意する必要があります。経験則として、のコードに、フレームワークのコードではなく、と書くことに焦点を当てる必要があります。慣例によるビュー名が正しく解決されているかどうかを確認するテストは、フレームワーク自体の単体テストであり、アプリケーション自体ではありません。

MVCでモックを使う良い方法を探しているなら、あなたのルート(ここでやろうとしているようなもの)のテストを見てみてください。あなたはfind a post by Phil Haack concerning just this subjectできます。

関連する問題