1

データレイヤーにアクセスして文字列を取得するHtmlHelperの単体テストを作成しようとしています。私はこれに関する多くの投稿を見てきましたが、おそらく何かが欠けています。私が抱えている問題は、データレイヤーへのアクセスをどのようにモックするかです。私は通常、コンストラクターを介して依存関係のijectionを実行しますが、htmlヘルパーは静的である必要があるため、ここでは実行できません。したがって、プロパティを介してインジェクションを設定しましたが、単体テストからこれにアクセスするにはどうすればよいですか。これが明らかな場合は申し訳ありませんが、今私を台無しにしています。

これが私が持っているものです-

public static class StringResourceHelper
{

    #region Private Members

    private static IStringResourceService _service;

    #endregion

    #region Public Properties

    private static IStringResourceService Service
    {
        get
        {
            if(_service==null)
            {
                _service = (IStringResourceService)Bootstrapper.Container.Resolve(typeof(IStringResourceService));
            }

            return _service;
        }
    }

    #endregion

    #region Public Methods

    public static string StringResource(this HtmlHelper helper, string label)
    {
        int languageCode;

        if(helper.ViewData["LanguageCode"] == null || !Int32.TryParse(helper.ViewData["LanguageCode"].ToString(), out languageCode))
        {
            languageCode = Constants.LanguageCodes.English;
        }

        return Service.GetString(label, languageCode);
    }

    #endregion

}

Service.GetString呼び出しをモックするにはどうすればよいですか?

4

2 に答える 2

1

免責事項 私は Typemock で働いています

静的メソッドをモック/偽造する必要があり、コードを変更せずにIsolatorを使用する必要がある場合。メソッドの偽装は、次を使用して行われます。

Isolate.WhenCalled(() => Service.GetString(string.empty, 0)).WillReturn(/*insert return value here*/);

Service.GetString に渡された引数を確認する場合は、次を使用します。

Isolate.Verify.WasCalledWithExactArguments(() => Service.GetString(/* use expected arguments*/);
于 2009-11-06T13:26:30.590 に答える
0

まず、メンバー変数を必要とする静的メソッドにはうんざりします。私には、それはあなたがオブジェクトを持っているという兆候です(おそらくSingletonlyスコープ)。したがって、私の最初の提案は、StringResourceHelper を非静的クラスに昇格させ、通常どおり DI を使用することです。

できない場合、選択した DI フレームワークは静的セッター注入をサポートしていますか? DI フレームワークをサービス ロケーターとして使用しているかのように見えるため、ブートストラップの外部で DI フレームワークを使用している何かを確認すると、警告ベルが鳴ります。

クラスを非静的に変更できず、DI フレームワークが静的セッター注入をサポートしていない場合は、次のいずれかを行います。

テスト セットアップの一部として DI フレームワークをセットアップして、モックを返すか、StringResourceHelper にセッターを追加して制御できるようにします。

于 2009-10-29T15:53:24.023 に答える