[英]Unit test a method reading file
我在网上搜索,但找不到合适的解决方案。 我的问题是我想测试我的readFileToList方法,该方法在file(csv)中进行过滤,并且; 创建对象列表。 在我的应用程序中还可以,我尝试在单元测试项目中使用以下方法对此进行测试:
[TestMethod]
public void readingFile()
{
HomeController controller = new HomeController();
List<City> result = controller.readFileToList("sample_data.csv", Pairing.Of("cityname", "Antalya"));
Assert.AreEqual(83, result.Count);//"cityname" equals to Antalya is 83
}
我调试该测试,然后看到函数中的错误; “ HttpRuntime.AppDomainAppPath”返回null,我想知道如何处理此问题以及接下来要测试此方法的问题。 我只希望生成的文件的此测试检查计数等于预期的计数(83)
功能:
public List<City> readFileToList(string filename, params KeyValuePair<string, object>[] queryparams)
{
string fullName = Path.Combine(HttpRuntime.AppDomainAppPath, "App_Data", filename);
string[] lines = System.IO.File.ReadAllLines(fullName);
IQueryable<City> cities = lines.Skip(1).Select(l => new City
{
name = l.Split(',')[0],
cityCode = Convert.ToInt32(l.Split(',')[1]),
district = l.Split(',')[2],
zipCode = l.Split(',')[3],
}).AsQueryable();
foreach (KeyValuePair<string, object> item in queryparams)
{
if (item.Key == "cityname" && item.Value.ToString() != "0")
cities = cities.Where(w => w.cityCode.ToString() == item.Value.ToString());
}
return cities.ToList();
}
假设您不必担心对实际的Input / Output进行单元测试 ,那么我想说的是,您要测试的方法没有一项,但至少具有两项职责 :
如果您的测试框架支持模拟静态成员 (您可以仅模拟/伪造HttpRuntime.AppDomainAppPath
以返回一些测试文件路径)或抽象HttpRuntime ,则可以保留原样,但我建议您将readFileToList
拆分为两个方法:
GetCsvFileServerPath(String csvFileName)
-将Path.Combine(HttpRuntime.AppDomainAppPath, "App_Data", filename);
public List<City> ReadFileToList(string fullServerFilePath, params KeyValuePair<string, object>[] queryparams)
其处理在一个文件fullServerFilePath
由返回GetCsvFileServerPath(String csvFileName)
因此,第二种方法可以相对容易地进行单元测试,而无需进行其他更改 。
PS:如果您有时间并且想要进行更适当的单元测试,则可以尝试提取文件IO ,或者至少进行单独的文件读取和处理 ,因为ReadFileToList
可以读取和处理文件,因此测试起来更加困难。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.