簡體   English   中英

在TDD中與Stream類型的屬性松散耦合的類

[英]Class that is loosely coupled from its properties of Stream type in TDD

我想編寫一個通過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。

第三個問題,理想情況下,它應該有一個Open(字符串fileName)。 但它可能沒有必要。

我建議你創建你的CsvReaderCvsWriter類,它將IStream接口作為CvsWriter參數,遵循依賴注入原則(就像你上面提到的那樣)。

在准備好測試並准備好代碼之后,您將創建一個小包裝器,現在采用文件名是構造函數/方法參數。 無需測試它,因為它只不過是打開流並將功能委托給已經測試的代碼。

我建議這個解決方案,它可以用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; }
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM