You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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引用

  1. 在Visual Studio的解决方案资源管理器中,右键点击你的.NET 6单元测试项目(TestProject1),选择添加 -> 引用。
  2. 在弹出的引用管理器中,切换到框架标签,找到并勾选System.Windows.Forms,点击确定。
  3. 重新编译测试项目,错误即可消除。

方案2:将业务逻辑与UI分离(更推荐)

直接测试Form类并非最佳实践,因为Form依赖UI框架,会增加测试复杂度。建议把Asdf这类纯业务逻辑方法提取到独立的普通类中:

  1. 在WinForms项目中新建一个类,比如Calculator.cs:
namespace WindowsFormsApp2
{
    public class Calculator
    {
        public int Asdf() { return 1; }
    }
}
  1. 在Form2中调用这个类的方法:
public partial class Form2 : Form
{
    private Calculator _calculator = new Calculator();
    public int Asdf() { return _calculator.Asdf(); }
    // 其他原有代码...
}
  1. 单元测试项目直接测试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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 22:09:52