繁体   English   中英

单元测试方法读取文件

[英]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进行单元测试 ,那么我想说的是,您要测试的方法没有一项,但至少具有两项职责

  1. 确定某个文件的服务器路径。
  2. 解析该文件。

如果您的测试框架支持模拟静态成员 (您可以仅模拟/伪造HttpRuntime.AppDomainAppPath以返回一些测试文件路径)或抽象HttpRuntime ,则可以保留原样,但我建议您将readFileToList拆分为两个方法:

  1. GetCsvFileServerPath(String csvFileName) -将Path.Combine(HttpRuntime.AppDomainAppPath, "App_Data", filename);
  2. 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM