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 支持读取或写入,而不是两者。

另一个问题,类的调用者应该只提供文件名。

第三个问题,理想情况下,它应该有一个 Open(string fileName)。但这可能不是必需的。

4

2 回答 2

2

我建议您按照依赖注入原则(就像您上面提到的那样)创建您的CsvReader,CvsWriter类,该类将接口作为构造函数参数。IStream

随着测试和代码准备就绪,您创建了一个小包装器,现在它的文件名是构造函数/方法参数。无需测试它,因为它只是打开流并将功能委派给已经测试过的代码。

于 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 回答