19

まず第一に、私はこの質問が危険なほど近いことを知っています: C#の単体テストでMapPathを実行する方法

しかし、私はそれが別の解決策を持っていることを望んでいます。私の問題は次のとおりです。

私のコードには、検証が必要なオブジェクトがあります。正しく検証されていることを確認するために、検証方法ごとに単体テストを作成しています。モックデータを作成してオブジェクトにロードし、検証しています。問題は、検証内でエラーが発生すると、エラーコードが割り当てられることです。このエラーコードは、Server.MapPathを使用してxmlファイルからエラーに関する情報を収集するために使用されます。ただし、xmlファイルを取得しようとすると、例外がスローされ、ファイルが見つからないことを意味します。

MapPathは単体テストではなく検証コードに含まれているので、単体テストでパスを認識させるにはどうすればよいですか?この質問は理にかなっていますか?

エラー行(私の検証コードではユニットテストではありません):

XDocument xdoc = XDocument.Load(HttpContext.Current.Server.MapPath("App_Data/ErrorCodes.xml"));

簡略化:単体テストは、Server.MapPathを呼び出すプログラム内のメソッドを呼び出しますが、このメソッドは失敗します。

4

4 に答える 4

15

「ファイル名プロバイダー」を抽象化して、場所を返すだけのクラスにすると、はるかに簡単にモックできます。

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());
于 2009-08-11T17:30:18.690 に答える
11

いくつかの厳密なグーグル検索と同僚の助けを借りて、.net に既に組み込まれている簡単なソリューションを思いつきました。

検証プロセスにアクセスする単体テストの上に、以下を追加しました。

 [TestMethod()]
 [HostType("ASP.NET")]
 [UrlToTest("http://localhost:###/upload_file.aspx")]
 [AspNetDevelopmentServerHost("Path To Web Application", "Path To Web Root")]

これは完全に機能します。基本的に、テストが呼び出されると、ページの読み込みで指定された単体テストで URL を読み込みます。現在単体テストを呼び出しているのは Web サイトであるため、検証では Server.MapPath にアクセスできます。この解決策はすべての人に当てはまるとは限りませんが、これには完璧でした. 貢献してくれた皆さんに感謝します。

于 2009-08-11T20:33:33.500 に答える
1

Rhino Mocksまたは代替のモックフレームワークを使用してhttpContext(または他の依存オブジェクト)をモックしてみてください。または、独自のモックオブジェクトを作成することもできます。または、MapPathWrapperクラスを記述し、実際の環境のMapPathWrapperBaseクラスから継承してから、単体テストでMockMapPathWrapperオブジェクトを作成します。

SOをモックする例はたくさんあるはずです。

これが私が尋ねたものです:

Rhinoモックを使用してHttpContext.Applicationをモックする方法

更新 私はAsp.NetMVCでこれを行った経験しかありませんが、私がイメージするWebフォームでは、HttpContextBaseクラスがないため、はるかに困難になります。

于 2009-08-11T17:22:58.457 に答える
1

依存関係を引数として受け入れるメソッドを抽出します。

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()、不足しているファイルを処理する方法をテストします。

于 2009-08-11T17:41:36.640 に答える