コントローラー/アクションに次のコード行があります
var defaultRoute = Url.RouteUrl("Default", new { action = "MyAction", controller = "MyController", id = 1 });
私は単体テストを書いており、この行をモックして何らかの URL を返すようにする必要があります。どうすればできるのかわかりません。この行のテストを書くのを手伝ってくれる人はいますか?
ありがとう
コントローラー/アクションに次のコード行があります
var defaultRoute = Url.RouteUrl("Default", new { action = "MyAction", controller = "MyController", id = 1 });
私は単体テストを書いており、この行をモックして何らかの URL を返すようにする必要があります。どうすればできるのかわかりません。この行のテストを書くのを手伝ってくれる人はいますか?
ありがとう
あなたの問題に関連するスレッドを見つけたと思います: How do I MOQ the System.IO.FileInfo class... or any other class without a interface?
問題は、インターフェイスを実装していないクラスや、それぞれのメソッド/プロパティが仮想に設定されているクラスをモックできないことです。
テストできないクラスのラッパークラスをいつでも作成してから、それをモックできます。
public interface IUrlRouterWrapper
{
// Put any methods you want to mock here...
void RouteUrl(string routeName, RouteValueDictionary routeValues);
}
public class UrlRouterWrapper : IUrlRouterWrapper
{
// ... and implement them here, calling through to the real, non-testable class.
public void RouteUrl(string routeName, RouteValueDictionary routeValues)
{
Url.RouteUrl(routeName, routeValues);
}
}
次に、RouteUrl を使用するコードで:
public class SomeOtherClass
{
private readonly IUrlRouterWrapper _urlRouterWrapper;
public SomeOtherClass(IUrlRouterWrapper urlRouterWrapper)
{
_urlRouterWrapper = urlRouterWrapper;
}
public void DoThings()
{
// ...
_urlRouterWrapper.WrapUrl("Default", new { action = "MyAction", controller = "MyController", id = 1 });
// ...
}
}
これで、心ゆくまでテストできる、簡単にモックできるインターフェイスIUrlRouterWrapper
ができました。