ASP.NET MVCについてお聞きしますか?たぶんそうだ。
コントローラのインスタンスを作成し、そのRequestContextを設定する必要があります。あなたはRequestContextのののHttpContextを嘲笑し、これのHttpContextの内側には、そのユーザーのプロパティを模擬し、あなたの嘲笑IPrincipalにそれを設定します
var principal = new Moq.Mock<IPrincipal>();
// ... mock IPrincipal as you wish
var httpContext = new Moq.Mock<HttpContextBase>();
httpContext.Setup(x => x.User).Returns(principal.Object);
// ... mock other httpContext's properties, methods, as needed
var reqContext = new RequestContext(httpContext.Object, new RouteData());
// now create the controller:
var controller = new MyController();
controller.ControllerContext =
new ControllerContext(reqContext, controller);
・ホープ、このことができます。
EDIT:あなたがここに見ることができるよう
FYI、コントローラクラス上のUserプロパティには、HttpContextオブジェクトから来ている(これはリフレクターから取得したユーザープロパティのgetterメソッド、です - あなたはASPをダウンロードすることができます.NET MVCだけでなく、ソースコード):
public IPrincipal User
{
get
{
if (this.HttpContext != null)
{
return this.HttpContext.User;
}
return null;
}
}
あなたは今のHttpContextプロパティをチェックすると、あなたが表示されます。
public HttpContextBase HttpContext
{
get
{
if (base.ControllerContext != null)
{
return base.ControllerContext.HttpContext;
}
return null;
}
}
だから、すべてが今まで読んで「でしたのみ"。そして私たちは嘲笑された "ユーザー"を "注入"する方法が必要です。そこで、実際にコントローラー上にControllerContextオブジェクトをプロパティで挿入できることを確認します。私たちは、それを適切にモックアップする方法を知って、それはその「のHttpContext」オブジェクトを取得する方法を確認します。だから、
public virtual HttpContextBase HttpContext
{
get
{
if (this._httpContext == null)
{
this._httpContext = (this._requestContext != null) ? this._requestContext.HttpContext : new EmptyHttpContext();
}
return this._httpContext;
}
set
{
this._httpContext = value;
}
}
、ここでは、ControllerContextオブジェクトは、それがのHttpContext RequestContextのオブジェクトからだ取得していることがわかります。
- 必要なデータとモックIPrincipal、
- モックのHttpContextを、そして
- 、IPrincipalでそれを養うモックRequestContextのを、とでそれを養う:だから、私は上記のやったことを説明するかもしれませんHttpContext、
- コントローラのインスタンスを作成し、ControllerContextプロパティを模擬されたRequestContextオブジェクトに設定します。
この魔法の後、コントローラーはWebサーバー経由で実際に接続せずにコントローラーを呼び出すことはできません。
したがって、コントローラの中でいつものように "User"プロパティを使用することができます。変更は必要ありません。
実際のコントローラクラスはどのように見えますか? – chobo2
どういう意味ですか?これは、アクションを持つ「通常の」コントローラでなければなりません。正確に何をテストしたいですか? –
まあ、このようなコントローラにコードを残すことはできません 私のモックアップではこれをセットアップしないで、私のコントローラにいくつかの方法を渡します(プロパティインジェクションまたはコンストラクタインジェクションによる)それは嘲笑されません。私はあなたのパスを何かreContextのものがコントローラコンテキストthngとコントローラに渡しているのを見ていますが、それが何であるかもわかりません。 – chobo2