c# - MoqでHttpApplicationStateをモックするときにオブジェクトを設定できないようです

c# unit-testing mocking moq httpapplicationstate

フィルターコンテキストのHttpContextのHttpApplicationStateにオブジェクトを設定するアクションフィルターがあります。ユニットテストでこの機能を使用したいのですが、何らかの理由で、HttpApplicationStateの派生元であるNameObjectCollectionBaseでオブジェクトが設定されていません。

MVCアプリケーションを実行すると期待どおりに機能するため、機能が機能することはわかっています。

テストをセットアップして、アプリケーション状態のオブジェクトを設定する方法を教えてください。私はMoqを使用しており、ここにこれまでのコードの一部があります。失敗する

Asset.IsNotNull(context.HttpContext.Application["config"]);


これがコードです。

public override void OnActionExecuted(ActionExecutedContext filterContext)
{
    ControllerBase controller = filterContext.Controller;
    if (!(controller is ApplicationController))
        return;

    ApplicationController applicationController = (ApplicationController) controller;

    IDictionary<string, string> config;

    // Loads the view configuration values.
    if (filterContext.HttpContext.Application["config"] == null)
    {
        config = applicationController.ApplicationService.GetConfiguration();
        filterContext.HttpContext.Application["config"] = config;
    }
    else
    {
        config = (IDictionary<string, string>) filterContext.HttpContext.Application["config"];
    }

    applicationController.ViewBag.BlogTitle = AddConfigurationValueToViewBag("BlogTitle", config);

}


これがこれまでのテストです。

[TestMethod]
public void ApplicationAttribute_OnActionExecuted_SetsConfigurationDctionaryInAppicationCache()
{
    // Arrange
    Mock<HttpContextBase> httpContext = new Mock<HttpContextBase>();

    var mockApplicationState = new Mock<HttpApplicationStateBase>();
    httpContext.Setup(h => h.Application).Returns(mockApplicationState.Object);

    ApplicationController applicationController = new BlogController(null, null, MocksAndStubs.CreateMockApplicationService());

    Mock<ActionExecutedContext> actionExecutedContext = new Mock<ActionExecutedContext>();
    actionExecutedContext.SetupGet(c => c.HttpContext).Returns(httpContext.Object);
    actionExecutedContext.SetupGet(c => c.Controller).Returns(applicationController);

    // Act
    ApplicationAttribute applicationAttribute = new ApplicationAttribute();
    ActionExecutedContext context = actionExecutedContext.Object;
    applicationAttribute.OnActionExecuted(context);

    // Assert
    Assert.IsNotNull(context.HttpContext.Application["config"]);
}
答え
モックオブジェクトが実際のオブジェクトのように機能することを期待しているようです。そのようには機能しません。モックはあなたが言うように実行するだけで、それ以上でもそれ以下でもありません。を呼び出すときにモックに特定の何かを返すように指示しない場合。 。 。

context.HttpContext.Application["config"]


。 。 。その後、それは単にしません。特定のものを返すようにモックを設定した場合、テストの目的が損なわれます。

追加の理解または状況(テスト状態の「何」および「なぜ」)がなければ、アプリケーション状態のセットが呼び出されることを確認しようとしているように見えます。オブジェクト自体の結果の状態をテストするのではなく、セットが発生したことをテストするアサーションとしてmockApplicationState.Verify()を実行することをお勧めします。

編集:
Verify()を使用すると、メソッド(またはプロパティメソッド)が呼び出されたことを、条件付きまたは条件なしでアサート/保証できます。これはあなたを始めるはずです:

http://code.google.com/p/moq/wiki/QuickStart#Verification

したがって、検証は次のようになります(完全にテストされていません!):

mockApplicationState.Verify(x => x["config"] == [expected value], Times.Once());


これは基本的に、mockApplicationState ["config"]が1回未満または1回を超える期待値に設定されている場合、テストに失敗することを示しています。

私はHttpApplicationStateBaseがシールされていないと仮定しています。その場合、上記は例外をスローする可能性があります。
関連記事

c# - ラインオブジェクトのエンドキャップの幅または高さの値を取得するにはどうすればよいですか?

c# - データベースにアクセスしてエンティティフレームワークデータをテストする

c# - LoadAsyncとMemoryStreamを使用して、データベースから画像ボックスに画像をロードしたい

c# - リピーターをカスタムクラスの配列にバインドする方法[閉まっている]

c# - CSSをasp.net Webアプリケーションに追加する方法

c# - WP7-アニメーションが早すぎて効果が残っていない

c# - richTextbox1からtextbox1?

c# - WPF:IValueConverterからスローされたUIにエラーメッセージを表示する方法

c# - Farseer 3.3有効化されていないボディが有効化された場合に衝突するかどうかのチェック(スポーン)

c# - WCFサービスからSilverlightアプリケーションにDataSetを渡す