2009-10-29 10 views
5

Moqを使用したモックからセッション値セットを返す際に問題が発生しました。私はセッションを設定し、いくつかのものを行うMoqモッキングとトラッキングセッション値

var th = new TestHelpers(); 
HttpContextBase httpContext = th.FakeHttpContext(); 

を使用して外の値を取得しようとすると

public class TestHelpers 
{ 
public long sessionValue = -1; 
public HttpContextBase FakeHttpContext() 
{ 

    var httpContext = new Mock<HttpContextBase>(); 
    var session = new Mock<HttpSessionStateBase>(); 
    httpContext.Setup(x => x.Session).Returns(session.Object); 
    httpContext.SetupGet(x => x.Session["id"]).Returns(sessionValue); 
    httpContext.SetupSet(x => x.Session["id"] = It.IsAny<long>()) 
     .Callback((string name, object val) => 
     { 
      sessionValue = (long)val; 
     }); 
    } 
} 

を以下の[ "ID"]

var sessionid = httpContext.Session["id"]; 

セッションIDを使用することが判明しました-1になります。しかし、私は設定セッション値を取得することができます

th.sessionValue 

何が問題なのですか? Moq経由で設定した値を返すことはできませんか?

答えて

11

私自身の質問に答えるのを止める必要があります。それは

httpContext.SetupSet(x => x.Session["id"] = It.IsAny<long>()) 
     .Callback((string name, object val) => 
     { 
      sessionValue = (long)val; 
      httpContext.SetupGet(x => x.Session["id"]).Returns(sessionValue); 
     }); 
+0

これは私のためにはうまくいかなかった:@ Konamimamは.Callbackが起動しないことが正しいと思われる。正しいアプローチはここにあるようです:http://stackoverflow.com/a/2921695/213609 –

2

MoqのSetupメソッドは、文字列インデックスを持つインデックス付きのプロパティでは機能しません。ここをクリックしてください:How to MOQ an Indexed property

+0

動作しない場合、Session ["id"]はnullを返し、-1以外を返します。 – sean

+0

また、あなたがリンクした質問に対する回答は、それが機能していると思われますか? –

1

あなたは値によって渡されたゲッターの値を返しているためです...私はそうのように再びセッション[「ID」]を模擬するために必要なことがわかりました。したがって、getterを呼び出すたびに、同じ値が返されます。

Delegateを使用して毎回評価されるように、Return()を変更します。そうすれば、毎回正しい値を得ることができます。

SetupSetの中に埋め込まれたSetupGetよりもずっと簡単です。

httpContext.SetupSet(x => x.Session["id"] = It.IsAny<long>()) 
     .Callback((string name, object val) => sessionValue = (long)val); 
httpContext.SetupGet(x => x.Session["id"]).Returns(() => sessionValue); 
1

私はちょうど以下、MOQでそれを行うための最も簡単な方法を把握しようと長い時間を費やしたが、実際に私のために働いた私のコードのコピー過去である:これは役立ちます

var _adminctrl = new Moq.Mock<AdminController>(); //AdminController is my MVC controller 

var mock = new Mock<ControllerContext>(); 
mock.Object.Controller = _adminctrl.Object; 
mock.Setup(p => p.HttpContext.Session["UserInfoKey"]).Returns(new ViewModel()); 
//here is the catch, attaching the ControllerContext to your controller 
_adminctrl.Object.ControllerContext = mock.Object; 

希望!

関連する問題