3

TDD 経由でストリーム型のプロパティを使用するクラスを作成したいと考えています。このクラスは、ファイル システムとの間でファイルを開いたり、書き込んだりします。以下のように:

 public class Csv 
    {         
        private TextReader streamReader; //TextReader is an abstract class, parent of streamReader 
        private TextWriter streamWriter;  //similar to TextReader and StreamWriter
          //Read(), Write(), and other methods that are specific to CSV.
        }

これでテスト可能です。

問題は、両方ではなく、各インスタンスの読み取りまたは書き込みのいずれかをサポートすることです。Csv は両方ではなく、読み取りまたは書き込みのいずれかをサポートするためです。

別の問題として、クラスの呼び出し元は fileName のみを提供する必要があります。

3 番目の問題、理想的には、Open(string fileName) が必要です。しかし、それは必要ないかもしれません。

4

2 に答える 2

2

依存性注入の原則に従って、インターフェースをコンストラクターパラメーターとして受け取るクラスを作成することをお勧めしますCsvReader(上記のように)。CvsWriterIStream

テストの準備とコードの準備ができたら、コンストラクター/メソッドのパラメーターであるファイル名を取る小さなラッパーを作成します。ストリームを開き、既にテスト済みのコードに機能を委譲するだけなので、テストする必要はありません。

于 2013-03-16T16:34:01.887 に答える
0

このソリューションをお勧めします。TDD でテストできます。Moq を使用して単体テストを行うことができます。

public class Csv : IReader, IWriter
{
    protected Stream Stream = null;
    public string IsReader;
    private StreamWriter writer = null;
    private StreamReader reader = null;
    public Csv(string fileName)
    {
        Stream = new FileStream(fileName, FileMode.OpenOrCreate);
    }


    public StreamWriter SrWriter
    {
        get
        {
            if (reader == null)
            {
                writer = new StreamWriter(Stream);
            }
            else
            {
                throw new NullReferenceException("Current stream type is reader");
            }

            return writer;
        }
    }

    public StreamReader SrReader
    {
        get
        {
            if (writer == null)
            {
                reader = new StreamReader(Stream);
            }
            else
            {
                throw new NullReferenceException("Current stream type is writer");
            }

            return reader;
        }
    }
}

    public interface IReader
    {
        StreamReader SrReader { get; }
    }
    public interface IWriter
    {
        StreamWriter SrWriter { get; }
    }
于 2013-03-16T14:43:19.703 に答える