如何在Windows窗体代码后面编写方法的单元测试

2024-05-01

我有想要测试的方法,但收到此错误“在创建窗口句柄之前无法在控件上调用 Invoke 或 BeginInvoke。”现在我还有一个列表框,正在我正在测试的函数中填充。因此,当我将方法分离到另一个类时,这是一个问题。

我理解这一点,因为表单需要首先运行,但是有其他选择吗?

public partial class ImportForm : Form
{
    public ImportForm()
    {
    }
    public bool Test(string[] fileNames)//Method to test
    {
        foreach (DataTable table in result.Tables)
        {
            foreach (DataRow dr in table.Rows)
            {
                if (!db.CouncilRefundCases.Any(
                        c => c.RequestReference == dr.ItemArray[1].ToString()))
                {
                    CouncilRefundCase data = new CouncilRefundCase()
                    {
                        FileId = fileId,
                        RequestReference = Convert.ToString(dr.ItemArray[1]),
                        CancelReason = Convert.ToString(dr.ItemArray[2]),
                        ProcessStatusId = (int?)ProcessStatus.Unprocessed,
                        ProcessDescription = new EnumHelper().GetDescription(ProcessStatus.Unprocessed),
                        DateCaptured = DateTime.Now
                    };

                    db.CouncilRefundCases.InsertOnSubmit(data);

                    //Succeeded ones
                    var item = new ListViewItem(dr.ItemArray[1].ToString());
                    lstSuccessSummary.Invoke((Action)delegate
                    {
                        lstSuccessSummary.Items.Add(item);
                    });
                }
                else
                {
                    //Failed ones
                    var item = new ListViewItem(dr.ItemArray[1].ToString());
                    lstSummary.Invoke((Action)delegate
                    {
                        lstSummary.Items.Add(item);
                    });
                }
            }
        }
        return true;
    }
}

这是我的单元测试

[TestMethod]
public void TestTest()
{
    bool results=false;
    var files = new string[4];
    files[0] = @"filename1.xlsx";
    files[1] = @"filename2.xlsx";

    ImportForm form= new ImportForm();
     results = form.Test(files);

    Assert.AreEqual(true, results);
}

注意 - 在阅读答案之前

一般来说,UI 代码和业务逻辑紧密耦合并不是一个好主意,但是如果您遇到无法重构以与 UI 解耦的代码,您可以使用以下解决方案来解决问题。

问题与解决方案

在显示表单之前,表单及其控件不处于Created https://msdn.microsoft.com/en-us/library/system.windows.forms.control.created(v=vs.110).aspx状态并且你不能使用Invoke窗体或其控件的方法。

要解决该问题,您可以强制创建窗体及其控件。为此,调用内部就足够了CreateControl(bool fIgnoreVisible) http://referencesource.microsoft.com/#System.Windows.Forms/winforms/Managed/System/WinForms/Control.cs,9ab3870cc070ff91您的表格和通行证的方法true将其作为参数:

var f = new Form1();
var createControl = f.GetType().GetMethod("CreateControl",
    BindingFlags.Instance | BindingFlags.NonPublic);
createControl.Invoke(f, new object[] { true });

替代解决方案

  • 显示的是Form在调用该方法之前。然后在运行单元测试期间将显示该表单。

  • 显示的是Form in a STA thread.

Example

假设您的表单中有这样的方法:

public partial class Form1 : Form
{
    //...
    public int Method1(int i)
    {
        this.Invoke(new Action(() => { i++; }));
        return i;
    }
}

然后在您的测试项目中,您可以使用以下代码:

[TestMethod]
public void TestMethod1()
{
    var f = new Form1();

    var createControl = f.GetType().GetMethod("CreateControl",
        BindingFlags.Instance | BindingFlags.NonPublic);
    createControl.Invoke(f, new object[] { true });

    var input = 0;
    var expected = 1;
    var actual = f.Method1(input);
    Assert.AreEqual(expected, actual);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在Windows窗体代码后面编写方法的单元测试 的相关文章

  • .net 运行时 - Silverlight 运行时 =?

    我用 google 搜索了一下 但没能找到 net CLR 中的哪些类未包含在 CoreCLR 又名 Silverlight 中的详细列表 Windows net Framework 中缺少什么 Silverlight 另外 是否存在 Si
  • boost线程在中断时不打印退出消息

    我有这段代码用于执行三个线程 其中第二个线程应在按 Enter 时中断并打印退出消息 void input val DO STUFF return void process val DO STUFF try cout lt lt waiti
  • 浮点提升:stroustrup vs 编译器 - 谁是对的?

    在 Stroustrup 的新书 C 编程语言 第四版 第 10 5 1 节中 他说 在执行算术运算之前 整数提升用于从较短的整数类型创建整数 类似地 浮点提升是用于从浮点数创建双精度数 我用以下代码确认了第一个声明 include
  • 组合 Datepicker 和 Timepicker 值 Win 8.1

    我试图同时使用 Datepicker Timepicker 来返回可以存储在数据库中的 DateTime 例如 我想要安排会议的开始日期和结束日期 如果适用 我将如何将这些值组合成 SQL 数据库可以处理的正确格式 任何反馈都会很棒 我让这
  • C#:使用 System.Text 和 System.Text.RegularExpressions 之间的区别

    在 ASP NET C 应用程序中 我注意到为了使用 Regex 和 StringBuilder 我必须将两者都放在 using System Text using System Text RegularExpressions 从简单的角度
  • 当格式字符串包含“{”时,String.Format 异常

    我正在使用 VSTS 2008 C Net 2 0 执行以下语句时 String Format 语句抛出 FormatException 有什么想法是错误的吗 这是获取我正在使用的 template html 的位置 我想在 templat
  • 抽象类和接口之间的区别[重复]

    这个问题在这里已经有答案了 可能的重复 接口与基类 https stackoverflow com questions 56867 interface vs base class 我不明白抽象类和接口之间的区别 我什么时候需要使用哪种字体
  • 标准 C 中的 sizeof 与 sizeof()? [复制]

    这个问题在这里已经有答案了 我看到一些直接使用 sizeof 的代码 想知道它是否是标准 C 令我惊讶的是 它运行得很好 这是一个例子 include
  • 如何在 C++ 中使用 PI 常数

    我想在一些 C 程序中使用 PI 常数和三角函数 我得到三角函数include
  • OpenMP C 程序运行速度比顺序代码慢

    我是 OpenMP 的新手 正在尝试并行化 Jarvis 的算法 然而事实证明 与顺序代码相比 并行程序花费的时间要长 2 3 倍 难道问题本身就不能并行化吗 或者我并行化它的方式有问题 这是我针对该问题的 openMP 程序 其中有 2
  • C# ToString("MM/dd/yy") 删除前导 0 [重复]

    这个问题在这里已经有答案了 可能的重复 格式化 NET DateTime Day 不带前导零 https stackoverflow com questions 988353 format net datetime day with no
  • 通过 MSBuild 调用 cl.exe 时无限期挂起

    我正在尝试在我的 主要是 C 项目上运行 MSBuild 想象一下一个非常庞大的代码库 Visual Studio 2015 是有问题的工具集 Windows 7 SP1 和 VS 2015 更新 2 即使使用 m 1 从而迫使它仅使用一个
  • 为什么我不能在扩展 List 的类中调用 OrderBy?

    我有一堂课 Deck 其中包含一个名为的方法Shuffle 我正在致力于重构Deck延长List
  • 在 MVVM 中,可以在视图后面的代码中访问 ViewModel 吗?

    在 MVVM 模式中 是否可以接受甚至可以访问视图代码后面的 ViewModel 属性 我有一个可观察的集合 它填充在 ViewModel 中 我需要在视图中使用它来绑定到带有链接列表的无限滚动条 IE private LinkedList
  • C# - 为什么我需要初始化 [Out] 参数

    我有几个从本机 dll 导入的方法 使用以下语法 internal static class DllClass DllImport Example dll EntryPoint ExampleFunction public static e
  • 删除对象时指针自动指向空

    假设我有一个对象和其他几个不同类类型的对象中的 10 个指向它的指针 如果对象被删除 这些指针必须设置为空 通常我会将对象的类与具有指向它的指针的类互连 以便它可以通知它们它正在被删除 并且它们可以将它们的指针设置为空 但这也有一个负担 即
  • 多个同名内存数据库

    关系到这个答案 https stackoverflow com a 48446491 596758 我试图通过设置让多个上下文工作UseInMemoryDatabase以同名 下面的测试失败 第二个上下文为空 我还需要做什么才能在内存数据库
  • 如何仅更改 DateTime 的日期部分,同时保留时间部分?

    我在代码中使用了很多 DateTime 我想将这些日期时间更改为我的特定日期并保留 时间 1 2012 02 02 06 00 00 gt 2015 12 12 06 00 00 2 2013 02 02 12 00 00 gt 2015
  • Windows 上 libcurl 的静态库[重复]

    这个问题在这里已经有答案了 如何将此库 libcurl 静态链接到 exe 我努力了 disable share enable static 没有帮助 我使用的是MingW32 有没有一种简单的方法来静态链接这个库 这样我的应用程序就不再有
  • 最后从同一类中的其他构造函数调用构造函数

    我在这里读到可以调用另一个构造函数从同一类中的另一个构造函数调用构造函数 https stackoverflow com questions 829870 calling constructor from other constructor

随机推荐

  • 使用 pdfbox 1.8.8 进行视觉签名

    我正在尝试生成带有视觉签名和 pdfbox 的 PDF 我有两个流 似乎 pdfbox 只能处理文件 如果没有三个临时文件 我就无法使其工作 我可以看到从here https github com apache pdfbox blob b7
  • 如何根据列表中的先前值过滤Haskell中的列表元素?

    我正在努力在 Haskell 中创建一个函数 该函数根据列表中前一个元素的条件过滤列表的数字 Example 前一个数字是 2 的倍数 myFunction 1 2 5 6 3 expected output 5 3 我知道如何申请filt
  • Symfony 功能测试失败,但相同的请求在浏览器中有效

    我跟着Symfony 文档 http symfony com doc current book testing html functional tests关于功能测试 以便编写我的第一个测试 但我有一些问题 我通过浏览器得到的响应效果很好
  • Heroku:无法访问该网站

    我的 heroku 应用程序在构建后无法访问 日志显示 Web 服务器节点和工作节点都在监听 这是一个由 Gunicorn 运行的 Flask 应用程序 它有 2 个插件 newrelic 和 redistogo Error This si
  • 面临减法时的算法复杂性

    我必须简化以下公式才能获得算法的时间复杂度 n 2 n 3 是否有任何适用的规则可以让我进一步简化这个表达式为更 常见 的 n 2 或类似的东西 我假设这就是结果 可能是错误的 我根本不知道如何处理这里的减法 通常 如果两个值相加 您只考虑
  • OpenGL:调试“单通道线框渲染”

    我正在尝试实现论文 单通道线框渲染 它看起来很简单 但它给了我所期望的厚暗值 论文没有给出计算海拔高度的确切代码 所以我按照自己认为合适的方式进行了操作 代码应该将三个顶点投影到视口空间中 获取它们的 高度 并将它们发送到片段着色器 片段着
  • 无法在 Dockerfile 中运行 sysctl 命令

    我正在尝试制作我的第一个 dockerfile 我对此很陌生 并且我需要系统来运行命令sysctl w kernel randomize va space 0 它是一个实验室环境 但我收到错误 sysctl 设置键 kernel rando
  • PyPandoc 与 PyInstaller 结合使用

    我安装了 PyInstaller 来为我的 python 脚本创建可执行文件 效果很好 我使用 PyPandoc 创建 docx报告 当正常的 python 文件运行时 它也可以正常运行 但不能从 PyInstaller 生成的可执行文件运
  • Python Flask 将基于经纬度的半径过滤器计算转换为 SQLalchemy

    我目前正在尝试实现半径的计算 我有一个带有房间的数据库 每个房间都有不同的地址以及纬度和经度 用户可以在搜索表单中输入城市名称来搜索该城市的房间 这里我想显示一个结果页面 其中包含搜索城市的房间 搜索城市半径60公里内其他城市的所有房间 H
  • CakePHP GROUP 和 COUNT 个项目在列表中返回

    我知道这里有一些类似的问题 但它们都是关于使用时的 Model gt find all 但这不是我正在做的 我正在做的 Model gt find list 这就是工作与不工作之间的区别 给定一组产品 我想找到该组中的所有品牌以及每个品牌的
  • HttpContext.Current.Request.Form 复选框

    我将表单发布到 MVC 控制器 我想在其中处理用户在类似 html 结构的网格上所做的一些更改 我在视图中为每一行呈现了呈现为简单 HTML 的复选框
  • 未绑定表单字段的验证

    我有一个表单 其中使用 property path gt false 添加了额外的未绑定字段 我想在这个领域进行简单的验证 我发现很多答案建议使用类似的东西 builder gt addValidator 但我发现在 symfony 2 1
  • Juno - Java 构建路径 - 项目无法读取或不是有效的 ZIP 文件

    我收到此错误 说明 资源路径 位置类型 所需库的存档 项目 Home 中的 src Program java 无法读取或无效 ZIP 文件主页 构建路径 构建路径问题 是什么原因导致此错误以及如何修复它 请按照以下导航 Right Clic
  • 为什么 Map.of 不允许空键和空值?

    在 Java 9 中 引入了新的工厂方法List Set and Map接口 这些方法允许使用一行中的值快速实例化 Map 对象 现在 如果我们考虑 Map
  • 我应该如何安全地存储密码并在 chrome 扩展中使用 http auth

    我正在制作一个 chrome 扩展 需要从安全服务器获取 xml 文件 我目前正在使用 XMLHttpRequest 来调用服务器 https username email protected cdn cgi l email protect
  • 如何在执行路由方法之前运行“中间件”函数?

    假设我有一个主干路由器 例如 routes homepage catalog id catalogPage catalog id products id2 productPage homepage gt doStuff catalogPag
  • 我需要 package-lock.json 和 package.json 吗?

    将我的 NPM 更新到最新版本 从 3 X 到 5 2 0 并运行后npm install在现有项目上 我得到一个自动创建的package lock json file 我可以告诉package lock json给我一个精确的依赖树 而不
  • C# 2013 无法创建默认证书。发布中止

    当我尝试运行使用 C 在 Visual Studio 2013 中构建的 exe 时 它 将在我编译它的计算机上运行得很好 当我尝试在不同的计算机上运行该程序时 我收到异常错误 所以我尝试发布该程序 但收到此错误 无法创建默认证书 发布中止
  • laravel 验证 required_with 和 required_with_all 之间有什么区别

    我已经尝试过看看https laravel com docs 5 4 validation https laravel com docs 5 4 validation但我仍然不明白两者之间有什么区别 全部必需 and 必需 无 任何人都可以
  • 如何在Windows窗体代码后面编写方法的单元测试

    我有想要测试的方法 但收到此错误 在创建窗口句柄之前无法在控件上调用 Invoke 或 BeginInvoke 现在我还有一个列表框 正在我正在测试的函数中填充 因此 当我将方法分离到另一个类时 这是一个问题 我理解这一点 因为表单需要首先