2009-04-24 5 views
0

私は現在、以下のアプローチを使用してセッション変数を表す厳密に型指定されたオブジェクトを作成しています。Rhinoモック付きユニットテストのためのASP.NET MVCでのCustomer SessionHandlerオブジェクトの模擬

public abstract class SessionController : Controller 
{ 
    private const string SESSION_NAME = "UserSession"; 

    public SessionData SessionData 
    { 
     get 
     { 
      SessionData sessionData = (SessionData)Session[SESSION_NAME]; 

      if (sessionData != null) 
      { 
       return sessionData; 
      } 
      else 
      { 
       sessionData = new SessionData(); 
       Session[SESSION_NAME] = sessionData; 

       return sessionData; 
      } 
     } 
     set 
     { 
      Session[SESSION_NAME] = value; 
     } 
    } 
} 

私はstrongley私れるSessionDataへのアクセスを入力したように、私はSessionControllerからそれを派生新しいコントローラを作成する場合SessionDataには、例えば

[Serializable] 
public class SessionData 
{ 
    public String SessionId { get; set; } 
    public Int64 UserId { get; set; } 
    public String NameOfUser { get; set; } 
} 

のような単純なオブジェクトです。たとえば、

public CityController : SessionController 
{ 
    [AcceptVerbs(HttpVerbs.Get)] 
    public ActionResult Index() 
    { 
     ViewData.Model = _cityService.GetAll(SessionData.UserId); 

     return View("Index"); 
    } 
} 

ですから、私はこのアプローチをユニットテストでカバーするために苦労しています。私が試したものの短縮バージョンは、次のスニペット

[SetUp] 
public void SetUp() 
{ 
    mocks = new MockRepository(); 
    _cityService = MockRepository.GenerateStub<ICityService>(); 
    _sesssionData = new SessionData { UserId = 1, SessionId = "1" }; 

    // First Approach 
    controller = new CityController(_cityService); 
    controller.Expect(p => p.SessionData).Return(_sesssionData); 

    // Second Approach 
    cctx = MockRepository.GenerateStub<ControllerContext>(); 
    cctx.Expect(p=>p.HttpContext.Session["UserSession"] as SessionData).Return(_sesssionData); 
    controller.ControllerContext = cctx; 
} 

でこの問題解決を取得する方法について誰先端を有し?

答えて

0

あなたがSessionDataにプロパティが仮想作る場合、あなたの最初のアプローチは、仕事ができる:

// Arrange 
var mocks = new MockRepository(); 
var cityService = MockRepository.GenerateStub<ICityService>(); 
var sesssionData = new SessionData { UserId = 1, SessionId = "1" }; 
var controller = mocks.PartialMock<CityController>(cityService); 
controller.Expect(c => c.SessionData).Return(sessionData); 
controller.Replay(); 

// Act 
controller.Index(); 

//Assert 
... 

SUT(テスト=>この場合CityControllerの下件名)と嘲笑されているためIMOこのアプローチは非常に良いではありませんPartialMock。

+0

ヒントとコードスニペットをありがとう。それは魅力のように働いた。私はこれが最良のアプローチではなく、その働きであることを知っています。現在のコードベースのインフラストラクチャ全体を変更したくないので、私はそれを使用します。 – Gordon

関連する問題