在C# WinForms中对Form类方法做单元测试时遭遇CS0012错误求助
问题
使用Visual Studio 2022 Community完成学校项目时遇到错误:
- WinForms项目目标框架为.NET 4.7.2,单元测试项目目标框架为.NET 6.0,均采用创建项目时的默认设置。
- 尝试测试WinForms项目中Form2的
Asdf方法时,测试代码的int actual = form2.Asdf();行出现红色下划线,错误提示:Error CS0012 The type 'Form' is defined in an assembly that is not referenced. You must add a reference to assembly 'System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.
WinForms项目代码
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace WindowsFormsApp2 { public partial class Form2 : Form { public int Asdf() { return 1; } private int x = 1; public Form2() { } } }
单元测试项目代码
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using WindowsFormsApp2; using Xunit; namespace TestProject1 { public class Class1 { [Fact] public void Form2_Asdf_Returns1() { Form2 form2 = new Form2(); int actual = form2.Asdf(); int expected = 1; Assert.Equal(expected, actual); } } }
解决方法
方案1:为单元测试项目添加System.Windows.Forms引用
- 在Visual Studio的解决方案资源管理器中,右键点击你的.NET 6单元测试项目(TestProject1),选择添加 -> 引用。
- 在弹出的引用管理器中,切换到框架标签,找到并勾选
System.Windows.Forms,点击确定。 - 重新编译测试项目,错误即可消除。
方案2:将业务逻辑与UI分离(更推荐)
直接测试Form类并非最佳实践,因为Form依赖UI框架,会增加测试复杂度。建议把Asdf这类纯业务逻辑方法提取到独立的普通类中:
- 在WinForms项目中新建一个类,比如
Calculator.cs:
namespace WindowsFormsApp2 { public class Calculator { public int Asdf() { return 1; } } }
- 在Form2中调用这个类的方法:
public partial class Form2 : Form { private Calculator _calculator = new Calculator(); public int Asdf() { return _calculator.Asdf(); } // 其他原有代码... }
- 单元测试项目直接测试
Calculator类,无需引用UI框架:
using WindowsFormsApp2; using Xunit; namespace TestProject1 { public class Class1 { [Fact] public void Calculator_Asdf_Returns1() { Calculator calculator = new Calculator(); int actual = calculator.Asdf(); int expected = 1; Assert.Equal(expected, actual); } } }
内容的提问来源于stack exchange,提问作者user25420791
相关产品推荐
相关产品推荐

