asp.net mvcのローカルおよびグローバルリソースの単体テスト
-
06-07-2019 - |
質問
GetGlobalResourceObjectとGetLocalResourceObjetをラップするクラスがあり、MVCで簡単に使用できます。モデル検証クラスは、リソースファイルからエラーメッセージを動的に読み込みます。問題は単体テストです。コードは"〜/"を使用し、ソリューションの実行時にすべてが正常に機能する一方で、次のエラー" System.Web.HttpExceptionが常に表示されるため、ユニットテストの作成方法がわかりません:アプリケーション相対仮想パスアプリケーションへのパスが不明なため、「〜/」を絶対パスにすることはできません。"
例外をスローするコードは次のとおりで、式を評価してグローバルリソースオブジェクトを返すために使用されます。
Private Function GetExpressionFields(ByVal expression As String) As ResourceExpressionFields
Return GetExpressionFields(expression, "~/")
End Function
Private Function GetExpressionFields(ByVal expression As String, ByVal path As String) As ResourceExpressionFields
Dim context As New ExpressionBuilderContext(path)
Dim resource_builder As New ResourceExpressionBuilder()
Dim fields As ResourceExpressionFields
fields = DirectCast(resource_builder.ParseExpression(expression, GetType(String), context), ResourceExpressionFields)
Return fields
End Function
これと、リソースファイルを使用する他のコードをテストする方法についてのアイデアはありますか?
解決
私は少し異なるアプローチを取りました。 App_ *ディレクトリ以外のリソースファイルを使用します。この場合、IDEはファイルにカスタムツールを追加し、ビューなどのソリューション内の任意の場所で動作し、単体テスト中に動作するリソースの厳密に型指定されたラッパーを生成します: http://odetocode.com/Blogs/scott/archive/ 2009/07/15 / 13211.aspx
それはあなたの質問に対する正確な答えではありませんが、すべての条件下でApp_ *リソースが正しく動作するようにするのはかなりの作業でした。
他のヒント
ResourceExtensionsクラスにプロパティ(bool IsInTestScopeなど)を作成し、テストクラスでtrueに設定すると、ローカライズされたテキストを返す内部メソッドは次のようになります。
public static string Resource(このコントローラーコントローラー、文字列式、params object [] args)
{
if(!IsInTestScope)
{
ResourceExpressionFields fields = GetResourceFields(expression、"〜/");
Return GetGlobalResource(fields、args);
}
return string.Empty;
}
App_ *ディレクトリ内のリソースを使用するコードをテストする方法を見つけました。 ブログリンクテキスト