1

ASP.NET MVC での単体テストのために Moq を使用して HttpRequest オブジェクトをモックしています。リクエストで ServerVariables (LOGON_USER) の 1 つを設定する必要があります。これは可能ですか?次の方法を試してみましたが、ServerVariables コレクションはオーバーライドできないため、例外が発生します。

    request.SetupGet(req => req.ServerVariables["LOGON_USER"]).Returns(@"TestUserName");

テスト用に ServerVariable 値を設定することはできますか?

特定のキーを設定しようとするのではなく、新しい NameValueCollection を渡す必要がありますか?

4

3 に答える 3

1

それはそれを行う1つの方法です。HttpRequest私は通常、ルールを変更してこれらのことを嘲笑します。テストで、またはその関連について知りたくありません。代わりに、私は尋ねます: ログオンしているユーザーの名前をどこで取得できますか?

そして、それはICallerContext私たちが思いつくことができるより良い名前になるでしょう. 次に、代わりにこのインターフェイスをモックします。

私のコントローラーには、新しい依存関係への参照が必要です。

public class MyController
{
  public MyController(ICallerContext caller) {...}
}

私のテストでは、モック化されたインスタンスをコントローラーに渡す必要があります。

var caller = new Mock<ICallerContext>();
var controller = new MyController(caller.Object);

caller.Setup(c => c.LogonUserName).Returns("TestUserName");

controller.DoTheMagic();

//Assertion(s) goes here...
于 2009-09-15T12:45:11.280 に答える
0

わかりました、これを考え出しました。ServerVariables の NameValueCollection を作成するために、次のメソッドを作成しました。

private static NameValueCollection CreateServerVariables(string logonUserName)
{
    var collection = new NameValueCollection {{"LOGON_USER", logonUserName}};
    return collection;
}

次に、構成で次のように呼び出しました。

    var request = new Mock<HttpRequestBase>();

    request.SetupGet(req => req.ServerVariables).Returns(CreateServerVariables(userName));
于 2009-07-20T13:45:10.790 に答える