できません。モックについて覚えやすいルールがあります-オーバーライドできず、モックできません1。クラスから派生している場合Url
、メソッドをオーバーライドできますAction
か? いいえ。Moq、Rhino、FakeItEasy、または DynamicProxy に基づくその他のフレームワークも使用できません。
あなたのオプションは以下のものを絞り込みます:
- DynamicProxy に基づいていない別のフレームワークを使用します (これは通常、高度な傍受のためのコンパイラ サービスに基づくことを意味します)。そのようなツールは通常有料です。
- 問題のある呼び出しをインターフェース/デリゲートでラップし、テスト済みのコードに挿入します(無料のフレームワークを使用してモックできるように)
ラッピングはどのようになりますか?
public interface IUrlWrapper
{
string Action(string name, object values);
}
// Wrapper Interface
public class TestedClass
{
private readonly IUrlWrapper url;
public TestedClass(IUrlWrapper urlWrapper)
{
this.url = urlWrapper;
}
// ...
return Json(new
{
redirectUrl = this.url.Action("Action", "Controller"),
isredirection = true
});
// ...
}
このようなセットアップでは、Moq を問題なく使用できます。ただし、単一のメソッド呼び出しではFunc
、分離フレームワークなしでデリゲートを使用することもできます。
// Func Delegate
public class TestedClass
{
private readonly Func<string, object, string> urlAction;
public TestedClass(Func<string, object, string> urlAction)
{
this.urlAction = urlAction;
}
// ...
return Json(new
{
redirectUrl = this.urlAction("Action", "Controller"),
isredirection = true
});
// ...
}
テストでは、その場でデリゲートを作成するだけです。
1 私はブログ投稿を書き、この問題の詳細をもう少し詳しく説明しました: How to mock private method with ...