1

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

 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;
 }

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

4

3 に答える 3

3

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

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

于 2012-04-17T09:16:22.927 に答える
1

いつでも一時 Xml を作成し、一時ファイルのパスを渡し、テストの実行後に削除することができます。[SetUp]NUnit では、[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]and属性はそれぞれand[TearDown]に置き換えることができます。ありがとうクワン![TestInitialize][TestCleanup]

于 2012-04-17T09:04:19.523 に答える
1

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

このようにすると、ファイル システムを方程式から除外することになります。これは、単体テストでは常に有効です。

于 2012-04-17T09:19:42.353 に答える