【发布时间】:2019-08-09 02:55:54
【问题描述】:
我有一项服务可以导出为 csv 文件,该文件在 WPF 应用程序的视频模型中:
public void ExportToExcel()
{
DataTable tblFiltered = _currentTable.AsEnumerable()
.Where(r => r.Field<string>("Type") == ExportGridGroup)
.CopyToDataTable();
StringBuilder sb = new StringBuilder();
IEnumerable<string> columnNames = tblFiltered.Columns.Cast<DataColumn>().
Select(column => column.ColumnName);
sb.AppendLine(string.Join(",", columnNames));
foreach (DataRow row in tblFiltered.Rows)
{
IEnumerable<string> fields = row.ItemArray.Select(field => "\"" + field.ToString() + "\"");
sb.AppendLine(string.Join(",", fields));
}
String result = sb.ToString();
try
{
StreamWriter sw = new StreamWriter("export.csv");
sw.WriteLine(result);
sw.Close();
Process.Start("export.csv");
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
所以基于此,我为它创建了一个测试方法,但还没有完成;
[TestMethod()]
public void ExportToExcelTest()
{
//Step 1: Creating a mock table with columns
DataTable testtable = new DataTable();
DataRow mydatarow;
mydatarow = testtable.NewRow();
//Step 2: Adding the row
mydatarow["ColumnA"] = "12345";
mydatarow["ColumnB"] = "test";
testtable.Rows.Add(mydatarow);
StringBuilder sb = new StringBuilder();
IEnumerable<string> columnNames = testtable.Columns.Cast<DataColumn>().
Select(column => column.ColumnName);
sb.AppendLine(string.Join(",", columnNames));
foreach (DataRow row in testtable.Rows)
{
IEnumerable<string> fields = row.ItemArray.Select(field => "\"" + field.ToString() + "\"");
sb.AppendLine(string.Join(",", fields));
}
String result = sb.ToString();
StreamWriter sw = new StreamWriter("export.csv");
sw.WriteLine(result);
sw.Close();
Process.Start("export.csv");
Assert.Fail();
}
我有点困惑,因为在测试方法中,我几乎在项目中编写了完全相同的代码..... 我能否就如何编写此单元测试以及使用 Moq 开始的 WPF/C# 单元测试的任何详细参考提供一些建议?
【问题讨论】:
-
被测方法中有很多紧密耦合,我认为在该方法中有效使用 Moq 的机会不多。考虑重构被测方法,使其依赖于服务抽象,从而使其更易于独立测试。
-
单元测试应该执行一个方法并断言结果。所以你应该打电话给
ExportToExcel而不是重新创建逻辑。但是,@Nikosi 说了什么。这段代码不是真正可测试的。
标签: c# wpf unit-testing moq