C#ユニット試験試験方法を使用するMapPath
-
12-09-2019 - |
質問
まず、私はこの問題は危険なほど近い:どのようにMapPath単位試験のC#
今しかし、この異なる。私の問題。
私のコードしているオブジェクトに対する必要が検証されます。私の作成ユニットテスト毎に検証方法れていることを確認してくださいの妥当性を検証ます。私の作成の模擬データをロードするオブジェクトの妥当性を検証します。その問題点の検証、エラーが発生した場合、エラーコードが割り当てられます。このエラーコードを使って情報収集については、情報の誤りからのxmlファイルをサーバーです。MapPath.ただし、取得しようとしたとき、xmlファイル、例外がスローされる意味のファイルできません。
以来、MapPathですが、やはり検証コードではなくて単体テストまで、どのように私の単体テストを認識することですか。こうしょう?
エラーライン(自分検証コードなユニット試験):
XDocument xdoc = XDocument.Load(HttpContext.Current.Server.MapPath("App_Data/ErrorCodes.xml"));
簡易:の単体テストまで電話をかける受ける方法のプログラムを通します。MapPathして失敗します。
解決
私は、あなたは、はるかに容易にそれを単に場所を返すクラスに「ファイル名プロバイダ」アウト抽象モックできるでしょう。
public class PathProvider
{
public virtual string GetPath()
{
return HttpContext.Current.Server.MapPath("App_Data/ErrorCodes.xml");
}
}
次に、あなたが直接PathProviderクラスを使用するか...
PathProvider pathProvider = new PathProvider();
XDocument xdoc = XDocument.Load(pathProvider.GetPath());
またはあなたのテストでそれをモックます:
PathProvider pathProvider = new MockPathProvider(); // using a mocking framework
XDocument xdoc = XDocument.Load(pathProvider.GetPath());
他のヒント
いくつかの厳しいグーグルや同僚からいくつかの助けの後に我々はすでに.NET
に組み込まれた簡単な解決策を考え出しました検証プロセスにアクセスするユニットテストの上、私が追加しました:
[TestMethod()]
[HostType("ASP.NET")]
[UrlToTest("http://localhost:###/upload_file.aspx")]
[AspNetDevelopmentServerHost("Path To Web Application", "Path To Web Root")]
これは完璧に動作します。テストが呼び出されたときに、基本的には、ページのロード中に指定されたユニットテストとURLをロードします。それが今でユニットテストを呼び出しているウェブサイトですので、検証はServer.MapPathのにアクセスできるようになります。このソリューションは、誰にとっても動作しない場合がありますが、それは、このために完璧でした。あなたが貢献したすべてに感謝します。
使ってみサイ疑似または代替嘲笑う枠組みを模擬しhttpContext(その他の依存のオブジェクト) まえご自身のモックオブジェクト。または書きMapPathWrapperクラスを継承からMapPathWrapperBaseクラスタ環境におユニットテストを作成しMockMapPathWrapperオブジェクトです。
あたっぷりの例嘲笑うるのです。
こちらは聞いて:
更新 今回の経験を行うことにAsp.Net MVCは、ケI imageinでさらに多くの困難な不足のために、HttpContextBaseクラスです。
私は、引数として、あなたの依存関係を受け入れる方法を抽出します。
public void Validate(HttpContext context)
{
ValidatePath(context.Server.MapPath("App_Data/ErrorCodes.xml"));
}
public void ValidatePath(string path)
{
XDocument xdoc = XDocument.Load(path);
ValidateDocument(xdoc);
}
public void ValidateDocument(XDocument xdoc)
{
// Original code
}
あなたはその後、独立して、様々な方法をテストすることができます。例えば、ValidatePath()
が不足しているファイルを処理する方法をテストします。