我想编写一个通过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)。但它可能没有必要。
答案 0 :(得分:2)
我建议你创建你的CsvReader
,CvsWriter
类,它将IStream
接口作为constuctor参数,遵循依赖注入原则(就像你上面提到的那样)。
随着测试准备就绪并且代码就绪,您创建了一个小包装器,现在采用文件名是构造函数/方法参数。不需要测试它,因为它只不过是打开流并将功能委托给已经测试的代码。
答案 1 :(得分: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; }
}