いじり始める前に、以前に作成したコードの周りにいくつかのテストを作成しようとしています。コントローラー メソッドが、T4MVC が画像とリンク用に作成する静的変数の一部を参照するという問題が発生しています。実際には、以前の質問hereと同じ問題ですが、コンストラクターにはありません。
問題は次のようなコードです。
if (User.IsInRole("Rate Admin") || User.IsInRole("Administrator"))
{
_ratesViewData.ActionLinks = new List<CustomActionLink>
{
new CustomActionLink("Edit",
editPath + Resources.DelimeterHyphen,
Links.Content.Images.openwhite_gif),
new CustomActionLink("Delete",
statusPath + Resources.DelimeterHyphen,
Links.Content.Images.openwhite_gif)
};
}
問題は Links.Content.Images.openwhite_gif です。T4MVC で生成されたコードでは、静的メソッド ProcessVirtualPath から VirtualPathUtility.ToAbsolute を呼び出します。ProcessVirtualPath または VirtualPathUtility をモックできないようです。
ProcessVirtualPath の上のコメントには、デリゲートを介して呼び出され、単体テストのために置き換えられることが示されています。デリゲートは次のとおりです。
public static Func<string, string> ProcessVirtualPath = ProcessVirtualPathDefault;
単体テストを可能にするために ProcessVirtualPath に対して呼び出されているものを置き換えるにはどうすればよいですか。それが本当に有効なパスを取得するかどうかは気にしません。ただ爆発させたくないだけです。テストメソッドからそれを行うことはできますか? 非テストプロジェクトでデバッグ中かどうかをテストするためにコードを変更せずに?
また、関連する質問は、上記のようなコードのベスト プラクティスは何ですか? アクセス許可ベースの条件のコードはどこに置くべきですか? またはアクションリンクでさえ。それらがビューデータモデルにある理由がわかりません。
OK、コメントで言及されているコードでこれを動作させることができました。
T4MVCHelpers.ProcessVirtualPath = (s) => "~/Content/Images";
ただし、テストが個別に実行される場合のみ、これを必要とするテストは、 TestControllerBuilderクラスを使用し、それを設定しない別のテストで実行されると失敗します。なんで?