0

0

c# 如何进行单元测试

煙雲

煙雲

发布时间:2026-01-14 20:27:09

|

835人浏览过

|

来源于php中文网

原创

必须安装 Microsoft.NET.Test.Sdk、测试框架(如 xunit)及对应运行器(如 xunit.runner.visualstudio);缺一不可,否则 dotnet test 报错“Could not find a test host executable”。

c# 如何进行单元测试

dotnet test 运行测试前必须装什么

不装测试运行器,dotnet test 会报错 Could not find a test host executable。核心是三样东西缺一不可:

  • Microsoft.NET.Test.Sdk:提供测试宿主和基础框架
  • 一个测试框架包,比如 xunitnunitmstest
  • 对应框架的运行器,例如 xunit.runner.visualstudio(用于 VS 和 dotnet test

推荐直接用 xunit,它和 .NET SDK 集成最稳。添加方式:

dotnet add package xunit
dotnet add package xunit.runner.visualstudio
dotnet add package Microsoft.NET.Test.Sdk
注意:.NET 6+ 项目中,Microsoft.NET.Test.Sdk 是必需的,否则 dotnet test 根本识别不出测试项目。

[Fact][Theory] 怎么选

[Fact] 用于无参数、固定逻辑的单次验证;[Theory] 必须配合 [InlineData][MemberData] 等数据源,适合验证同一逻辑在多组输入下的行为。

常见误用是把本该用 [Theory] 的边界测试硬写成多个 [Fact],既冗余又难维护。比如验证字符串长度限制:

public class StringValidatorTests
{
[Theory]
[InlineData("a", true)]
[InlineData("ab", true)]
[InlineData("abc", false)] // 超长
public void ValidateLength_WithVariousInputs_ReturnsExpected(string input, bool expected)
{
var result = StringValidator.ValidateLength(input, maxLength: 2);
Assert.Equal(expected, result);
}
}

如果只测一种情况,用 [Fact] 更直白;但凡涉及输入组合、边界值、空/零/负数等,优先上 [Theory]

MiniMax Agent
MiniMax Agent

MiniMax平台推出的Agent智能体助手

下载

如何让测试访问 internal 成员

被测类或方法设为 internal 是常见做法,但默认情况下测试项目无法访问。解决方法是在被测项目的 .csproj 中加一行:



其中 MyApp.Tests 是测试项目的程序集名(不是文件夹名,也不是命名空间)。如果测试项目启用了强名称签名,还得补上公钥:
漏掉这步,编译不报错,但运行时 Assert 会失败——因为根本调不到目标方法,null 或默认值导致断言崩了,容易误判为逻辑错误。

异步方法测试必须用 async Task 当返回类型

async void 或忽略 await 是最常踩的坑。以下写法会导致测试“假通过”:

[Fact]
public void WhenCallingApi_ThenReturnsData() // ❌ 返回 void
{
var result = await MyService.GetDataAsync(); // 编译不过,但假设你绕过了
Assert.NotNull(result);
}
正确写法必须是:
[Fact]
public async Task WhenCallingApi_ThenReturnsData() // ✅
{
var result = await MyService.GetDataAsync();
Assert.NotNull(result);
}
原因:xUnit 需要控制异步生命周期,只有返回 Task 才能真正等待完成。否则测试框架在异步操作结束前就标记为通过,掩盖真实问题。

测试里最容易被忽略的是异步等待的完整性,以及 internal 成员的可见性配置——这两处不显式处理,问题往往延迟暴露,查起来反而更费时间。

相关专题

更多
c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

231

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

435

2024.03.01

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

254

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

206

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1463

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

617

2023.11.24

java读取文件转成字符串的方法
java读取文件转成字符串的方法

Java8引入了新的文件I/O API,使用java.nio.file.Files类读取文件内容更加方便。对于较旧版本的Java,可以使用java.io.FileReader和java.io.BufferedReader来读取文件。在这些方法中,你需要将文件路径替换为你的实际文件路径,并且可能需要处理可能的IOException异常。想了解更多java的相关内容,可以阅读本专题下面的文章。

548

2024.03.22

php中定义字符串的方式
php中定义字符串的方式

php中定义字符串的方式:单引号;双引号;heredoc语法等等。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

543

2024.04.29

Java 桌面应用开发(JavaFX 实战)
Java 桌面应用开发(JavaFX 实战)

本专题系统讲解 Java 在桌面应用开发领域的实战应用,重点围绕 JavaFX 框架,涵盖界面布局、控件使用、事件处理、FXML、样式美化(CSS)、多线程与UI响应优化,以及桌面应用的打包与发布。通过完整示例项目,帮助学习者掌握 使用 Java 构建现代化、跨平台桌面应用程序的核心能力。

36

2026.01.14

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Java 教程
Java 教程

共578课时 | 45.9万人学习

国外Web开发全栈课程全集
国外Web开发全栈课程全集

共12课时 | 1.0万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号