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

如何为注入了JsonSerializerOptions的C#类编写单元测试?

解决方案

你遇到的报错是因为大多数Mock框架默认不支持密封类的模拟,针对这个场景有两种可行的落地方式:

方案一:直接使用真实配置实例(推荐,无需修改现有业务代码)

JsonSerializerOptions 是无副作用的纯配置类,不需要做Mock,单元测试时直接构造和生产环境配置一致的实例传入构造函数即可,示例代码如下:

// 单元测试代码示例
var mockLogger = new Mock<ILogger<MyService>>();
var mockRedis = new Mock<IConnectionMultiplexer>();
// 直接构造真实的JsonSerializerOptions实例
var testSerializerOptions = new JsonSerializerOptions()
{
    PropertyNameCaseInsensitive = true,
    PropertyNamingPolicy = JsonNamingPolicy.CamelCase
};
// 实例化被测服务
var myService = new MyService(mockLogger.Object, mockRedis.Object, testSerializerOptions);

这个方案改动成本为0,完全适配你的现有业务逻辑。

方案二:抽象依赖层(适合需要多配置切换、动态调整配置的场景)

如果你需要对序列化配置做Mock来验证不同配置下的业务逻辑,可以新增一层抽象接口来解耦对密封类的直接依赖,步骤如下:

  1. 定义抽象提供器接口
public interface IJsonSerializerOptionsProvider
{
    JsonSerializerOptions Options { get; }
}
  1. 实现提供器类,封装配置逻辑
public class DefaultJsonSerializerOptionsProvider : IJsonSerializerOptionsProvider
{
    public JsonSerializerOptions Options { get; }

    public DefaultJsonSerializerOptionsProvider()
    {
        Options = new JsonSerializerOptions()
        {
            PropertyNameCaseInsensitive = true,
            PropertyNamingPolicy = JsonNamingPolicy.CamelCase
        };
    }
}
  1. 修改服务注册逻辑(Program.cs)
// 替换原有JsonSerializerOptions的注册
services.AddSingleton<IJsonSerializerOptionsProvider, DefaultJsonSerializerOptionsProvider>();
  1. 修改MyService的依赖注入逻辑
public MyService(ILogger<MyService> logger, 
IConnectionMultiplexer redisConnection, 
IJsonSerializerOptionsProvider optionsProvider)
{
    this.logger = logger;
    this.redisConnection = redisConnection;
    // 从提供器中获取配置实例
    this.options = optionsProvider.Options;
}

调整后单元测试可以直接Mock IJsonSerializerOptionsProvider 接口,返回任意需要的配置实例即可。


不推荐使用Mock框架的密封类模拟特性(比如Moq的CallBase配置),该方式依赖特定框架的黑盒特性,兼容性和可维护性较差。

内容的提问来源于stack exchange,提问作者surprised_ferret

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.09 23:15:03