2009-06-29 13 views
14

これにはいくつかのポインタが必要です。見つけたthisthisしかし、私はまだ親切に混乱しています。ASP.NET MVCのアクションフィルタをテストするには?

私はちょうどActionExecutedContextを模擬し、それを渡し、フィルタを少し動作させて結果を確認したいと思っています。

助けが必要ですか?

フィルタのソースhere
(これは少し変更されましたが、現時点では問題にはなりません)。

So - 私はユニットテストをしたい、そのRememberUrlフィルタはスマートにセッション内の現在のURLを保存するスマートです。

+0

ActionExecutedContextは、ControllerContextから派生したものです。 Haackedの答えはちょうどControllerContextを嘲笑することです - http://stackoverflow.com/questions/32640/mocking-asp-net-mvc-controller-context/32672#32672正確に何を混乱させていますか? –

+0

まだ完了していません。私はasp.net mvc innerworkingsの知識が不足していると思います。 :) –

+0

あなたのコードを投稿してください。私たちは助けてくれるでしょう:) –

答えて

11

1)ActionExecutedContextでモッキングRequest.Url:

var request = new Mock<HttpRequestBase>(); 
request.SetupGet(r => r.HttpMethod).Returns("GET"); 
request.SetupGet(r => r.Url).Returns(new Uri("http://somesite/action")); 

var httpContext = new Mock<HttpContextBase>(); 
httpContext.SetupGet(c => c.Request).Returns(request.Object); 

var actionExecutedContext = new Mock<ActionExecutedContext>(); 
actionExecutedContext.SetupGet(c => c.HttpContext).Returns(httpContext.Object); 

2)あなたはRememberUrlAttributeの公開コンストラクタでセッションラッパーを注入していると仮定します。

var rememberUrl = new RememberUrlAttribute(yourSessionWrapper); 

rememberUrl.OnActionExecuted(actionExecutedContext.Object); 

// Then check what is in your SessionWrapper 
+0

rememberUrlは "ActionExecutedCotnext"メソッドを持っていません。 –

+0

OnActionExecutedです。とにかく - それは私がついにそれを得たようです。単にhttpContextを適切にモックする必要があります。もう一度感謝します - 本当にありがとうございます。 :) –

+0

.......固定:) –

3

これが結果です:

クリーンなテストを保つために<HttpWhatever>モックラップ
#region usages 

using System; 
using System.Collections.Specialized; 
using System.Web; 
using System.Web.Mvc; 
using x.TestBase; 
using x.UI.y.Infrastructure.Enums; 
using x.UI.y.Infrastructure.Filters; 
using x.UI.y.Test.Mocks; 
using Moq; 

//considering switch to NUnit... :D 
using Microsoft.VisualStudio.TestTools.UnitTesting; 

#endregion 

namespace x.UI.y.Test.Unit.Infrastructure.Filters 
{ 
    [TestClass] 
    public class RememberUrlTester : TesterBase 
    { 
     private static HttpContextBaseMock _context = 
      new HttpContextBaseMock(); 
     private static ActionExecutedContextMock _actionContext = 
      new ActionExecutedContextMock(_context.Object); 

     [TestMethod] 
     //"Can save url in session" (i prefer test names in my own language :) 
     public void SpeejPieglabaatUrlSesijaa() 
     { 
      //Arrange 
      const string _url = "http://www.foo.bar/foo?bar=bar"; 
      _context.RequestMock.SetUrl(_url);  
      var filter = new RememberUrlAttribute(); 

      //Act 
      filter.OnActionExecuted(_actionContext.Object); 

      //Assert 
      _context.SessionMock.Verify 
       (m => m.Add(SessionKey.PreviousUrl.ToString(), _url)); 
     } 
    } 
} 

私は物事をより良くすることができると確信していますが、私はそれが素晴らしいスタートだと思うし、とても興奮しています。

最後に、HttpContextモンスターが制御されています! ^^

+0

それがうまくいくなら、それは素晴らしいですが、xUnitの人々はなぜそれをビルドしたのかを書いています。これは読んだ価値があります:http://xunit.codeplex.com/wikipage ?title = WhyDidWeBuildXunit&referencedTitle = Home – ZeroBugBounce

+0

@richdietこれはずっと前です。私は今日xUnitを好むだろう。 –

関連する問題