C# 访问ASP.NET核心中配置的JSON序列化程序

C# 访问ASP.NET核心中配置的JSON序列化程序,c#,.net,json,testing,asp.net-core,C#,.net,Json,Testing,Asp.net Core,我有一个API控制器,它返回类ExampleDataType的实例。默认行为是将对象序列化为JSON,这很好 API控制器代码段: [Route("api/[controller]")] [ApiController] public class ExampleController : ControllerBase { [HttpGet] public ExampleDataType Get() { return new ExampleDataType();

我有一个API控制器,它返回类ExampleDataType的实例。默认行为是将对象序列化为JSON,这很好

API控制器代码段:

[Route("api/[controller]")]
[ApiController]
public class ExampleController : ControllerBase
{
    [HttpGet]
    public ExampleDataType Get()
    {
        return new ExampleDataType();
    }
}
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvc()
            .SetCompatibilityVersion(CompatibilityVersion.Version_2_2)
            .AddJsonOptions(options =>
            {
                options.UseMemberCasing();
            });
    }
我想稍微改变对象序列化的方式(属性大小写)。我以以下方式配置了内置于ASP.NET核心应用程序中的JSON序列化程序:

Startup.cs:

[Route("api/[controller]")]
[ApiController]
public class ExampleController : ControllerBase
{
    [HttpGet]
    public ExampleDataType Get()
    {
        return new ExampleDataType();
    }
}
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvc()
            .SetCompatibilityVersion(CompatibilityVersion.Version_2_2)
            .AddJsonOptions(options =>
            {
                options.UseMemberCasing();
            });
    }
到目前为止还不错。现在,我想创建一个(单元?)测试来记录预期的行为。我对这种测试的想法是:

  • 使用服务器中应用的自定义项访问JSON序列化程序
  • 在测试类实例上使用序列化程序
  • 断言结果
  • 我已经知道如何使用WebApplicationFactory生成内存中的测试服务器实例。唉,我不知道如何访问服务器中配置的序列化程序


    有什么想法吗?

    那么你想测试一下微软的代码是否有效吗?或者您已经按照应该的方式配置了它?你的测试方式会有所不同。对于后者,您可以模拟
    AddJsonOptions
    方法,并测试传入的函数是否适当地设置了选项……这是在测试框架,这是一个巨大的禁忌。ASP.NET核心已经过全面测试。如果您将JSON序列化程序设置为
    UseMemberCasing
    ,那么您可以放心它会。如果您想测试实际包含的待办事项行集,那么只需点击一个返回JSON的操作,并进行区分大小写的字符串比较,以确保成员大小写正确。更好的方法是在端点上进行适当的集成测试,并验证属性大小写正确。单元测试一个您并不拥有并且隐藏在框架深处的组件没有什么用处。你宁愿测试它所期望的效果是否适用。好吧,我要说的是,追求100%的代码覆盖率是愚蠢的。您希望对代码库中最重要的部分进行测试,甚至可能接近完整的代码覆盖率,但最终您会发现自己花费了过多的时间来测试总体上无关紧要的事情。这里的情况非常清楚,“疯狂的程序员可以手工使用JsonConvert”-是的,而且这种情况并没有通过验证您是否正确配置了框架的测试进行验证。如果您要求某些端点以特定格式返回输出,那么您需要测试该端点,而不是中间的某个组件,该组件可能会或可能不会用于该端点除非您实际正在构建框架,否则您将需要测试实际操作/端点实现。那么您是否希望测试Microsoft的代码是否正常工作?或者您已经按照应该的方式配置了它?你的测试方式会有所不同。对于后者,您可以模拟
    AddJsonOptions
    方法,并测试传入的函数是否适当地设置了选项……这是在测试框架,这是一个巨大的禁忌。ASP.NET核心已经过全面测试。如果您将JSON序列化程序设置为
    UseMemberCasing
    ,那么您可以放心它会。如果您想测试实际包含的待办事项行集,那么只需点击一个返回JSON的操作,并进行区分大小写的字符串比较,以确保成员大小写正确。更好的方法是在端点上进行适当的集成测试,并验证属性大小写正确。单元测试一个您并不拥有并且隐藏在框架深处的组件没有什么用处。你宁愿测试它所期望的效果是否适用。好吧,我要说的是,追求100%的代码覆盖率是愚蠢的。您希望对代码库中最重要的部分进行测试,甚至可能接近完整的代码覆盖率,但最终您会发现自己花费了过多的时间来测试总体上无关紧要的事情。这里的情况非常清楚,“疯狂的程序员可以手工使用JsonConvert”-是的,而且这种情况并没有通过验证您是否正确配置了框架的测试进行验证。如果您要求某些端点以特定格式返回输出,那么您需要测试该端点,而不是中间的某个组件,该组件可能会或可能不会用于该端点除非您实际上正在构建一个框架,否则您将需要测试实际的操作/端点实现。