如何使用Visual Studio 2013 Ultimate对WinForms进行单元测试

本文关键字:WinForms 单元测试 Ultimate 何使用 Visual Studio 2013 | 更新日期: 2023-09-27 17:57:48

我从工具|扩展和更新中添加:NUnit测试适配器,NUnit测试生成器,适用于Visual Studio 2012和2013的xUnit.net运行程序,单元测试生成器。

只有单元测试生成器似乎给了我一个上下文菜单项,允许我右键单击窗体的类构造函数并"生成单元测试"。但是,当我右键单击同一项目中一个普通旧类的方法时,该上下文菜单项不会出现。如果我尝试为按钮单击或文本框选择生成单元测试,包括从表单设计器代码(例如this.button1.Click += new System.EventHandler(this.button1_Click);)中的任何位置尝试,则该上下文方法也不会出现。为什么?

此外,虽然"生成单元测试"让我可以选择MSTest、NUnit和XUnit,但只有MSTest有效。另外两个选项创建新的测试项目,但不创建测试类,并生成一个长错误消息框:

未找到与约束匹配的导出:

合同名称

NuGet.VisualStudio.IVsPackageInstallerServices

所需类型标识

NuGet.VisualStudio.IVsPackageInstallerServices

最后,生成的骨架MSTest方法没有显示访问表单及其控件的明显方式。这篇文章的作者http://www.steveandrews.me/blog/2008/02/05/testing-the-winforms-ui,显然在2008年使用了不同的Visual Studio,他写道,生成的方法包括有助于访问表单的代码:

`[TestMethod()]
[DeploymentItem("WindowsFormsApplication1.exe")]
public void InitializeComponentTest()
{
    Form1_Accessor target = new Form1_Accessor(); // TODO: Initialize to an appropriate value
    target.InitializeComponent();
    Assert.Inconclusive("A method that does not return a value cannot be verified.");
}`

现在,有了Visual Studio 2013 Ultimate和MSTest,我得到的只是:

[TestMethod()] public void Form1Test() { throw new NotImplementedException(); }

我在其他地方读到,如果想测试文本框选择和按钮点击等内容,应该使用MVVM模式,但我想知道是否有"正确"的方法从Visual Studio内部对经典的WinForms进行单元测试。(我显然是这一切的新手!)

感谢

如何使用Visual Studio 2013 Ultimate对WinForms进行单元测试

单元测试私有方法是一种糟糕的做法,将类设置为内部并使用InternalsVisibleTo属性以便进行测试也是如此。

基本上,如果您有一个私有方法,那么该方法代表了类的实现细节——该方法的作用与您的测试工作无关。应该测试的是类的公共API。

"好吧,我想测试一些隐藏在私有方法中的逻辑,但很难将数据传递到我的公共API,因为它会命中我私有方法中所有的逻辑!"你可能会说。这是对我刚刚给出的建议的常见回应,有一个答案:

很难通过公共API测试的逻辑通常表明您的类设计不好。您需要开始将类分解为多个较小的类,并通过它们的公共API测试这些类中的每个。

现在,最后一件事:您正在尝试测试Windows窗体。WinForms是古老的,即使是粗略的尝试也不会引导你走上使用现代模式和实践的道路,比如分离关注点。这意味着您的业务逻辑中通常混合了许多视图逻辑,这使得单元测试更加困难。您可以考虑开始实现MVP模式。

中使用的Accessor已弃用,并且不包括在VS2012以后的版本中。

你不能再进入私人空间了。

您可以做的是使类成为内部类,并使用InternalsVisibleTo属性使单元测试程序集能够访问它们。