Рассмотрите возможность извлечения кода из вашего блока try
в другую службу
public interface ICsvWriter
{
void WriteOutput(string text);
}
и передайте его как зависимость от конструктора службы экспорта
public Service(ICsvWriter csvWriter)
{
this.csvWriter = csvWriter;
}
Затем вы можете написатьтест, подобный этому, чтобы убедиться, что он действительно выводит то, что вы ожидаете.
[TestMethod]
public void TestMethod1()
{
var csvWriter= new Mock<ICsvWriter>();
var service = new Service(csvWriter.Object);
string exportedText = string.Empty;
// set up your mock so that whatatever string you pass in
// gets passed to your exportedText variable.
csvWriter.Setup(s => s.WriteOutput(It.IsAny<string>())).Callback<string>(s => exportedText = s);
var testtable = new DataTable();
// .... add test data
// set the table on the view model
service.SetData(testtable);
// call the export method.
service.ExportToExcel();
// check that the result matches your expectation
Assert.AreEqual("the text you expect to be written", exportedText);
}
Обновление
Вы можете улучшить свой тест, используя параметризованное тестирование для тестирования различныхсценарии с тем же методом тестирования.
Если вы используете MSTest, есть атрибут DataRow.Для xUnit это называется InlineData или для NUnit это называется TestCase.Все они работают так:
[TestMethod]
[DataRow("12345", "test", "expected output text")]
[DataRow("abcde", "123", "expected output text")]
[DataRow("fghij", "456", "expected output text")]
public void TestMethod1(string columnA, string columnB, string expectedOutput)
{
// ....
}
Обновление
Вы также можете улучшить тестируемость вашего метода экспорта, передав в качестве параметра DataTable
.Затем вы можете проверить его, не имея публичного свойства для установки данных.
public void ExportToExcel(DataTable currentTable)
{
DataTable tblFiltered = currentTable.AsEnumerable()
.Where(r => r.Field<string>("Type") == ExportGridGroup)
.CopyToDataTable();
// ...
}
Другое обновление
На самом деле, использование обратного вызова не требуется.Извините, я должен был предложить сделать это более чистым способом:
Настроить так:
csvWriter.Setup(s => s.WriteOutput(It.IsAny<string>()));
Затем проверить это следующим образом:
csvWriter.Verify(s => s.WriteOutput("expected text"), Times.Once);