【问题标题】:Unit test a method reading file单元测试方法读取文件
【发布时间】:2016-11-12 12:14:08
【问题描述】:

我在网上搜索但找不到合适的解决方案。我的问题是我想测试我的 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();
        }

【问题讨论】:

    标签: c# unit-testing


    【解决方案1】:

    假设您不太担心unittesting actual Input/Output,我会说您尝试测试的方法没有,但至少two responsibilities

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

    如果您的测试框架supports mocking of static members(您可以模拟/伪造HttpRuntime.AppDomainAppPath 以返回一些测试文件路径)或abstract the HttpRuntime,您可以保持原样,但我建议您拆分@987654330 @分成两种方法:

    1. GetCsvFileServerPath(String csvFileName) - 那将是Path.Combine(HttpRuntime.AppDomainAppPath, "App_Data", filename);
    2. public List&lt;City&gt; ReadFileToList(string fullServerFilePath, params KeyValuePair&lt;string, object&gt;[] queryparams) 处理由GetCsvFileServerPath(String csvFileName) 返回的fullServerFilePath 处的文件

    所以第二种方法可以在没有additional changes的情况下相对容易地进行单元测试。

    PS:如果你有时间,想做更合适的单元测试,你可以试试abstract file IO,或者至少分开文件读取和处理,因为ReadFileToList 既读取又处理文件,这更难测试。

    【讨论】:

    • “如果您的测试框架支持模拟静态成员”。我不这么认为。我怎样才能添加这个?是 VS 原生库还是第三方组件?
    • @TyForHelpDude 并非所有测试框架/第三方库都支持它。我给你的参考讨论了MS Fakes(它不是免费的——你必须使用完整的VS——visualstudio.uservoice.com/forums/121579-visual-studio-2015/…)。其他一些免费框架支持这些东西,但并不多。无论如何,最好将文件路径计算和实际解析分开。
    猜你喜欢
    • 2017-09-04
    • 2013-10-11
    • 2014-01-09
    • 1970-01-01
    • 1970-01-01
    • 2021-08-01
    • 2015-05-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多