2012-04-17 17 views
1

ユニットテストをどのような依存関係からも分離する必要があることは分かっています。私はTypemockを使ってアプリケーションの単体テストを書こうとしています。問題は、クラス内のメソッドの1つで、いくつかのXMLファイルパスパラメータを受け入れ、そのメソッドのどこかで使用されるメソッド内にXMLDocumentオブジェクトを作成することです。xmlファイルパスをパラメータとして受け入れるメソッドのユニットテストの書き方

public bool ValidateXml(String aFilePath, String ruleXmlPath) 
{ 
    XmlDocument myValidatedXml = new XmlDocument(); 
    try 
    { 
     myValidatedXml.Load(aFilePath); 
    } 
    catch 
    { 
     return false; 
    } 


    XmlDocument myRuleXml = new XmlDocument(); 
    try 
    { 
     myRuleXml.Load(ruleXmlPath); 
    } 
    catch 
    { 
     return false; 
    } 

    MyClass myObject = new MyClass(myValidatedXml); 
    //Do something more with myObject. 

    XmlNodeList rules = myRuleXml.SelectNodes("//rule"); 
    //Do something more with rules object. 

    return true; 
} 

物理的な場所を指定することなくユニットテストを作成するにはどうすればよいですか? 注:残念ながらコードを変更することはできません。

+5

コードを変更できない場合、単体テストがバグを公開した場合はどうなりますか?真剣に - XmlDocumentまたはストリームのいずれかを受け入れ、それをテストするオーバーロードを追加します。次に、新しいメソッドに委譲するだけで、現在の実装を書き直します。 – rjnilsson

+0

@Cwan true、変更が許可されていないコードのテストは、奇妙なものです –

+0

これも私が悩まされているのですが、私は上司ではありません。しかし、彼らは彼らのレガシーアプリの単体テストを書くことに非常に熱心なので、彼らと一緒に試してみることにします。 –

答えて

1

いつでもtemp Xmlを作成して、一時ファイルのパスを渡してから、テストの実行後に削除することができます。 NUnitでは、これは[SetUp][TearDown]属性を使って簡単に達成できます。

[TestFixture] 
public class MyTest 
{ 
    private string tempPathXML; 

    [SetUp] 
    public void SetUp() 
    { 
     //Create XML file 
     // Save it in a temp path 
    } 

    [TearDown] 
    public void TearDown() 
    { 
     //Delete the temp file 
    } 

    public void SampleTestForValidateXml() 
    { 
     //Test using tempPathXML 
    } 
} 

Setup方法は、各テストケースとTeardown方法は後の各テストケースを実行する

を実行する:MSTestをするため[Setup][TearDown]属性が[TestInitialize]に置き換えることができますそれぞれ[TestCleanup]である。ありがとうクワン!

+0

ありがとうが、私はVisual Studio Unit TestingエディタでTypemockを使用しています。 –

+3

@Azhar:あなたがMSTestを使用していると仮定します。[SetUp]/[TearDown]を[TestInitialize]/[TestCleanup]に置き換えてください。 – rjnilsson

+0

@Cwan Thanks v much。 –

3

ABコラムの提案は、回避策としては問題ありません。また、テストプロジェクトに一連のテスト用XMLファイルを用意し、それらのファイルへのパスをテスト中のテスト済みメソッドに渡すこともできます。

ただし、ファイルシステムへの依存関係は、データベースの依存関係と同じfashoinで分離する必要があるという一般的な注意をしています。あなたのような場合、私は通常、ある種類のFileManager:IFileManagerによって提供されるストリームまたはバイト配列からXMLドキュメントをロードします。このファイルマネージャは、ファイルシステム操作をカプセル化します。

1

リファクタリングする必要がありますので、XmlDocumentを渡します。またはさらに良い。ラッパー(XmlDocWrapperと呼ぶ)は、XmlDocumentsの機能をカプセル化します。ラッパーはIXmlDocWrapperインターフェースを持つことができます。インターフェースを渡すと、クラスをテストするときにモックできます。

このようにすると、ファイルシステムは常に単体テストの良い方程式のままになります。

関連する問題