xUnit中如何声明内部Fixture类以测试内部类型?
解决方案:将Fixture声明为Internal或封装内部类型访问
直接把Fixture声明为internal是完全可行的,主流测试框架(如xUnit、NUnit)都支持识别internal的Fixture类,只需做好以下配置和编码:
1. 确保测试框架能发现Internal的Fixture/测试类
- xUnit:需要在测试项目的
.csproj中额外添加配置,让xUnit运行器能访问测试项目的internal类型:<ItemGroup> <!-- 允许测试项目访问被测项目的内部类型 --> <InternalsVisibleTo Include="[被测项目名称]" /> <!-- 允许xUnit运行器访问测试项目的内部类型 --> <InternalsVisibleTo Include="xunit.runner.visualstudio" /> </ItemGroup> - NUnit:默认支持识别internal的
[TestFixture]类,无需额外配置运行器可见性,只要被测项目已通过InternalsVisibleTo授权测试项目访问即可。
2. 编写Internal Fixture并使用内部类型
示例代码如下(以xUnit为例):
// 被测项目中的internal类 namespace MyProject { internal class InternalService { public string GetValue() => "test"; } } // 测试项目中的internal Fixture namespace MyProject.Tests { internal class InternalServiceFixture { // 直接使用被测项目的内部类型作为成员 public InternalService Service { get; } = new InternalService(); } // 测试类可设为public或internal,只要能被测试框架发现 public class InternalServiceTests : IClassFixture<InternalServiceFixture> { private readonly InternalServiceFixture _fixture; public InternalServiceTests(InternalServiceFixture fixture) { _fixture = fixture; } [Fact] public void GetValue_ReturnsTest() { var result = _fixture.Service.GetValue(); Assert.Equal("test", result); } } }
替代方案:不修改Fixture访问修饰符
如果不想把Fixture改成internal,也可以通过封装避免暴露内部类型:将Fixture中内部类型的成员设为private,通过公共方法封装对内部类型的操作:
public class InternalServiceFixture { // 内部类型成员设为私有 private readonly InternalService _service = new InternalService(); // 提供公共方法封装操作 public string GetServiceValue() => _service.GetValue(); } public class InternalServiceTests : IClassFixture<InternalServiceFixture> { [Fact] public void GetValue_ReturnsTest() { var fixture = new InternalServiceFixture(); var result = fixture.GetServiceValue(); Assert.Equal("test", result); } }
内容的提问来源于stack exchange,提问作者Alexandre Bell
相关产品推荐
相关产品推荐

