我在网上搜索但无法找到合适的解决方案。我的问题是我想测试我的readFileToList方法,该方法在文件(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();
}
答案 0 :(得分:3)
假设您对unittesting actual Input/Output并不担心,我会说您尝试测试的方法不是一个,但至少two responsibilities:
如果您的测试框架supports mocking of static members(您可以模拟/伪造HttpRuntime.AppDomainAppPath
以返回某些测试文件路径)或abstract the 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)
处的文件
醇>
因此,第二种方法可以在没有additional changes的情况下相对容易地进行单元测试。
PS:如果您有时间并希望进行更合适的单元测试,您可以尝试abstract file IO或至少单独的文件读取和处理 ,因为ReadFileToList
都会读取和处理文件,因此更难以测试。