C# WinForms单元测试

C# WinForms单元测试,c#,winforms,unit-testing,C#,Winforms,Unit Testing,我收到一个旧的大型WinForm应用程序,并被要求为其编写一个单元测试项目 Asside:代码使用.xlsx文件作为脚本,这些脚本可能很复杂。我最初(标准实践)的想法是使每个测试原子化,然而,调用需要测试的方法的方式很复杂,并且依赖于许多其他代码组件。所以我决定调用一个脚本来测试所需的组件 编写代码时没有考虑单元测试,为了调用测试,我需要首先打开一个.xlsx文件;这意味着我的测试将具有以下结构: [TestMethod] public void SomeTest() { Workb

我收到一个旧的大型WinForm应用程序,并被要求为其编写一个单元测试项目


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()
,我将接受。。。谢谢你抽出时间。