string _inboundFilePath = AppDomain.CurrentDomain.BaseDirectory + @"\Inbound\CompareDataFile.csv";
var mockReaderStream = new Mock<IReaderStream>();
mockReaderStream.Setup(x => x.CreateStream())
.Returns(new System.IO.StreamReader(_inboundFilePath));
在这里,我依赖于入站文件来读取数据,然后执行其他功能检查。我的问题是如何避免这种情况?在这种情况下,我正在检查数据以获取来自csv的特定ID。
答案 0 :(得分:3)
这不太可能是一个好习惯,因为单元测试必须是确定性的。这意味着无论情况如何,您都必须确保如果运行此测试,它将执行与以前完全相同的操作。
如果您读取csv文件,则测试将取决于外部环境。不幸的是,外部世界是不稳定的。首先,可以更改csv文件。
这就是为什么最好的做法是从程序集中的嵌入式资源获取csv文件流,而不是从硬盘驱动器上的文件获取csv文件流。
答案 1 :(得分:0)
除了Stephane的回答。我会建议你:
将@“ \ Inbound \ CompareDataFile.csv”放入配置文件。
在上述类中创建公共属性或单独的方法,这些属性将能够检索并返回入站文件的绝对路径(称为 GetPath )。
创建有权访问配置文件的UnitTest方法。此TestMethod必须读取配置文件,并调用 AppDomain.CurrentDomain.BaseDirectory 。因此,此方法还可以检索入站文件的绝对路径,并且在此调用之后 GetPath()
创建抽象(Mock上方的接口或抽象类-(在您提供的代码中它不是模拟的,所以很难猜测为什么要这样))。
在上述类中创建需要抽象对象的公共方法,并调用其方法 ReadFromCsv()。
创建将实现此抽象的Test类(模拟),并在调用其方法 ReadFromCsv()时返回所需/不需要的值。
最后,测试您的课程。
PS。这不是测试类的严格算法,可以使用它。您希望从所有这七个项目中得到的是单元测试相似性的概念。
也,您不会从配置文件中释放您的课程,因此,请使用这种方法从配置中释放您的课程: How to mock ConfigurationManager.AppSettings with moq