C# 单元测试读取文件的方法
我在网上搜索,但找不到合适的解决办法。我的问题是我想测试我的readFileToList方法,它是在文件中制作一个过滤器(csv)和;创建对象列表。 在我的应用程序中,我尝试在单元测试项目中使用以下方法来测试这一点:C# 单元测试读取文件的方法,c#,unit-testing,C#,Unit Testing,我在网上搜索,但找不到合适的解决办法。我的问题是我想测试我的readFileToList方法,它是在文件中制作一个过滤器(csv)和;创建对象列表。 在我的应用程序中,我尝试在单元测试项目中使用以下方法来测试这一点: [TestMethod] public void readingFile() { HomeController controller = new HomeController(); List
[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
}
[TestMethod]
公共无效读取文件()
{
HomeController=新的HomeController();
列表结果=controller.readFileToList(“sample_data.csv”,Pairing.Of(“cityname”,“Antalya”);
Assert.AreEqual(83,result.Count);/“cityname”等于Antalya是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();
}
public List readFileToList(字符串文件名,参数KeyValuePair[]queryparams)
{
字符串fullName=Path.Combine(HttpRuntime.AppDomainAppPath,“App_数据”,文件名);
string[]lines=System.IO.File.ReadAllLines(全名);
IQueryable cities=行。跳过(1)。选择(l=>新城市
{
name=l.Split(',')[0],
cityCode=Convert.ToInt32(l.Split(',')[1]),
地区=l.Split(',')[2],
zipCode=l.Split(',')[3],
}).AsQueryable();
foreach(queryparams中的KeyValuePair项)
{
if(item.Key==“cityname”&&item.Value.ToString()!=“0”)
cities=cities.Where(w=>w.cityCode.ToString()==item.Value.ToString());
}
返回城市;
}
假设您不太担心,我会说您尝试测试的方法没有一个,但至少:
HttpRuntime.AppDomainAppPath
以返回一些测试文件路径)或者,我建议您将readFileToList
分为两种方法:
GetCsvFileServerPath(字符串csvFileName)
-将Path.Combine(HttpRuntime.AppDomainAppPath,“应用程序数据”,文件名)代码>
public List ReadFileToList(string fullServerFilePath,params KeyValuePair[]queryparams)
在GetCsvFileServerPath(string csvFileName)
返回的fullServerFilePath
中处理文件p.S.:如果你有时间想做更多适当的单元测试,你可以尝试,或者至少分开文件读取和处理,因为
ReadFileToList
同时读取和处理文件,这更难测试。假设你不太担心,我想说,您尝试测试的方法没有一个,但至少:
HttpRuntime.AppDomainAppPath
以返回一些测试文件路径)或者,我建议您将readFileToList
分为两种方法:
GetCsvFileServerPath(字符串csvFileName)
-将Path.Combine(HttpRuntime.AppDomainAppPath,“应用程序数据”,文件名)代码>
public List ReadFileToList(string fullServerFilePath,params KeyValuePair[]queryparams)
在GetCsvFileServerPath(string csvFileName)
返回的fullServerFilePath
中处理文件p.S.:如果您有时间并且想进行更适当的单元测试,您可以尝试,或者至少将文件读取和处理分开,因为
ReadFileToList
读取和处理文件,这更难测试。“如果您的测试框架支持模拟静态成员”。我不这么认为。我如何添加这个?它是相对于本机库还是第三方组件?@TyForHelpDude并非所有测试框架/第三方库都支持它。我给你的参考讨论了(它不是免费的-你必须使用完整的VS-)。其他一些免费框架支持这样的东西,但不是很多。在任何情况下,最好将文件路径计算和实际解析分开。“如果您的测试框架支持模拟静态成员”。我不这么认为。我如何添加这个?它是相对于本机库还是第三方组件?@TyForHelpDude并非所有测试框架/第三方库都支持它。我给你的参考讨论了(它不是免费的-你必须使用完整的VS-)。其他一些免费框架支持这样的东西,但不是很多。在任何情况下,最好将文件路径计算和实际解析分开。