10

コントローラーの Request.IsAuthenicated 呼び出しを単体テストできるように、HttpContext をモックアウトしようとしています。Scott Hanselman のブログで見つけたコードを使用して、rhino.mocks を使用して HttpContext をシミュレートしています。だから私はこのユニットテストピースを持っています:

PostsController postsController = new PostsController(postDL);
mocks.SetFakeControllerContext(postsController);
Expect.Call(postsController.Request.IsAuthenticated).Return(true);

私のコントローラーアクションでは if(Request.IsAuthenticated).... 、単体テストを実行しようとすると、テストが null 例外をスローして失敗し、単体テストをデバッグしようとすると、HttpContext がコントローラーに割り当てられていないことがわかります。何か案は?

4

6 に答える 6

8

これは機能するはずです:

PostsController postsController = new PostsController(postDL);
var context = mocks.Stub<HttpContextBase>();
var request = mocks.Stub<HttpRequestBase>();
SetupResult.For(request.IsAuthenticated).Return(true);
SetupResult.For(context.Request).Return(request);    
postsController.ControllerContext = new ControllerContext(context, new RouteData(), postsController);
于 2008-10-27T13:55:46.130 に答える
2

これはあなたにとって役立つかもしれませんが、同様のシナリオで私のために働きました:

http://haacked.com/archive/2007/06/19/unit-tests-web-code-without-a-web-server-using-httpsimulator.aspx

于 2008-10-27T10:04:47.983 に答える
1

これについて私が書いた投稿が何らかの形で役立つかもしれません http://santoshbenjamin.wordpress.com/2008/08/04/mock-httpcontext-and-session-state/

乾杯ベンジー

于 2008-11-11T22:32:20.927 に答える
0

これは、コンテキストを偽造する簡単な方法の 1 つです。Jeff のブログから見つけました。

        TextWriter tw = new StringWriter();
        HttpWorkerRequest wr = new SimpleWorkerRequest("/webapp", "c:\\inetpub\\wwwroot\\webapp\\", "default.aspx", "", tw);
        HttpContext.Current = new HttpContext(wr);
于 2011-09-21T12:51:30.297 に答える
0

さて、開示のために、私はあなたが扱っているもののほとんどをまだ手を汚していませんが、

IsAuthenticated をモックしたい場合は、テスト コードで操作できる bool を返す静的クラスを作成してみませんか?

これは端が少し荒いですが、うまくいけばアイデアが得られます:

interface IAuthenticationChecker
{
    bool IsAuthenticated { get; }
}

public class MockAuthenticationChecker : IAuthenticationChecker
{
    static bool _authenticated = false;

    public static void SetAuthenticated(bool value)
    {
        _authenticated = value;
    }
    #region IAuthenticationChecker Members

    public bool IsAuthenticated
    {
        get { return _authenticated; }
    }

    #endregion
}

public class RequestAuthenticationChecker : IAuthenticationChecker
{

    #region IAuthenticationChecker Members

    public bool IsAuthenticated
    {
        get {
            if (HttpContext.Current == null)
                throw new ApplicationException(
                    "Unable to Retrieve IsAuthenticated for Request becuse there is no current HttpContext.");

            return HttpContext.Current.Request.IsAuthenticated;
        }
    }

    #endregion
}

次に、アプリレベルでいずれかへの参照を使用できます。つまり、アプリレベルで参照を追加する必要があり、リクエストではなく別の参照を使用する必要がありますが、テスト用の認証を完全に制御することもできます:)

参考までに-これはバラバラになりやすいので、約1分でまとめました:)

于 2008-10-27T09:32:07.580 に答える
0

使えそうなクラスです。ajax リクエスト、ユーザー認証、リクエスト パラメータなどを処理します: https://gist.github.com/3004119

于 2012-06-27T13:52:31.303 に答える