C# WinForms单元测试
我收到一个旧的大型WinForm应用程序,并被要求为其编写一个单元测试项目C# WinForms单元测试,c#,winforms,unit-testing,C#,Winforms,Unit Testing,我收到一个旧的大型WinForm应用程序,并被要求为其编写一个单元测试项目 Asside:代码使用.xlsx文件作为脚本,这些脚本可能很复杂。我最初(标准实践)的想法是使每个测试原子化,然而,调用需要测试的方法的方式很复杂,并且依赖于许多其他代码组件。所以我决定调用一个脚本来测试所需的组件 编写代码时没有考虑单元测试,为了调用测试,我需要首先打开一个.xlsx文件;这意味着我的测试将具有以下结构: [TestMethod] public void SomeTest() { Workb
Asside:代码使用.xlsx文件作为脚本,这些脚本可能很复杂。我最初(标准实践)的想法是使每个测试原子化,然而,调用需要测试的方法的方式很复杂,并且依赖于许多其他代码组件。所以我决定调用一个脚本来测试所需的组件
编写代码时没有考虑单元测试,为了调用测试,我需要首先打开一个.xlsx文件;这意味着我的测试将具有以下结构:
[TestMethod]
public void SomeTest()
{
WorkbookSet workbookSet = Factory.GetWorkbookSet(CultureInfo.CurrentCulture);
Workbook workbook = workbookSet.Workbooks.Add();
workbookSet.GetLock();
try
{
// Open the script.
string testScriptPath = Path.Combine(
Environment.CurrentDirectory, "Scripts\\Test.xlsx");
SSGForm doc = new SSGForm();
if (FileExists(testScriptPath))
OpenExistingWb(ref doc, ref workbookSet, ref workbook, testScriptPath);
// Do testing here...
}
finally
{
workbookSet.ReleaseLock();
}
}
对于所有测试,我们必须有工作簿集
/工作簿
初始化和获取/释放锁()
操作。在我自己的WPF应用程序中,我以前没有遇到过代码复制的问题,因为我从一开始就将应用程序设计为可单元测试的。我的问题是,是否有一种标准的方法来测试用锅炉板包装实际测试代码(//此处进行测试…
)?
当然,在实际代码中,我可以使用带有接口的策略/工厂模式,或者只将Func
(或者Action
用于void
return)注入包装器方法中,但这对测试是否可行
谢谢你抽出时间
编辑。比如:
private void RunTest(Action action)
{
WorkbookSet workbookSet = Factory.GetWorkbookSet(CultureInfo.CurrentCulture);
Workbook workbook = workbookSet.Workbooks.Add();
workbookSet.GetLock();
try
{
string testScriptPath = Path.Combine(
Environment.CurrentDirectory, "Scripts\\Test.xlsx");
SSGForm doc = new SSGForm();
if (Utils.FileExists(testScriptPath))
mainRibbonForm.OpenExistingWb(ref doc, ref workbookSet, ref workbook, testScriptPath);
// Run the test logic.
action();
}
finally
{
workbookSet.ReleaseLock();
}
}
[TestMethod]
public void SomeTest()
{
RunTest(() =>
{
// Logic here.
});
}
你在问题中描述了方法;要将SSGForm传递给您的操作,您只需使用
操作
委托:
private void RunTest(Action<SSGForm> action)
{
WorkbookSet workbookSet = Factory.GetWorkbookSet(CultureInfo.CurrentCulture);
Workbook workbook = workbookSet.Workbooks.Add();
workbookSet.GetLock();
try
{
string testScriptPath = Path.Combine(
Environment.CurrentDirectory, "Scripts\\Test.xlsx");
SSGForm doc = new SSGForm();
if (Utils.FileExists(testScriptPath))
mainRibbonForm.OpenExistingWb(ref doc, ref workbookSet, ref workbook, testScriptPath);
// Run the test logic.
action(doc);
}
finally
{
workbookSet.ReleaseLock();
}
}
[TestMethod]
public void SomeTest()
{
RunTest(doc =>
{
// Logic here.
Foo(doc);
});
}
private void运行测试(操作)
{
WorkbookSet WorkbookSet=Factory.GetWorkbookSet(CultureInfo.CurrentCulture);
工作簿=workbookSet.Workbooks.Add();
workbookSet.GetLock();
尝试
{
字符串testScriptPath=Path.Combine(
Environment.CurrentDirectory,“Scripts\\Test.xlsx”);
SSGForm doc=新的SSGForm();
if(Utils.FileExists(testScriptPath))
mainRibbonForm.OpenExistingWb(参考文档、参考工作簿集、参考工作簿、测试脚本路径);
//运行测试逻辑。
行动(doc);
}
最后
{
工作簿集。释放锁();
}
}
[测试方法]
公共测试()
{
运行测试(doc=>
{
//逻辑在这里。
Foo(doc);
});
}
我倾向于将函数注入包装器方法。@henginy我在问题中提供了一个示例。这似乎是一个合理的方法-你同意吗?是的,这正是我的想法。如果你没有编辑你的问题来包含它,我会把它作为答案发布。也许有人会想出一个更好的办法,去做吧。如果您能演示如何将doc
传递到我的action()
,我将接受。。。谢谢你抽出时间。