【问题标题】:AutoFixture generate an JsonDocument?AutoFixture 生成一个 JsonDocument?
【发布时间】:2021-02-10 11:29:09
【问题描述】:

我目前正在尝试运行单元测试,我需要 AutoFixture 来生成 JsonDocument 属性。

但这是不可能的,因为

 AutoFixture.ObjectCreationExceptionWithPath : AutoFixture was unable to create an instance from System.Text.Json.Utf8JsonReader&, most likely because it has no public constructor, is an abstract or non-public type.

如何使用 AutoFixture 自动创建一个包含JsonDocument 的类。

我想使用 AutoFixture 创建的类非常简单,所有属性都是简单类型,除了JsonDocument

public class Car 
{
   public string Name;
   public int Age;
   public JsonDocument GeneralCarInfo;
}

【问题讨论】:

    标签: unit-testing autofixture system.text.json


    【解决方案1】:

    如果一个空的Json就足够了,你可以使用下面的AutoFixture customization

    public class EmptyJsonDocumentCustomization : ICustomization
    {
        public void Customize(IFixture fixture)
        {
            fixture.Customize<JsonDocument>(x =>
                x.FromFactory(() =>
                    JsonDocument.Parse("{}")));
        }
    }
    

    如果没有,您可能需要序列化与您的场景相匹配的 JSON。

    【讨论】:

      【解决方案2】:

      如果一个空的JsonDocument 就足够了,我相信 Serhii 提出的解决方案已经足够好了。

      如果您想要一个填充模型,则必须自定义 AutoFixture,以便它知道如何将数据传送到您的 JsonDocument。如果您还没有GeneralCarInfo 模型,您可以在测试项目中创建一个并对其进行自定义,使其与您希望在 SUT 中拥有的数据相似。然后你可以自定义你原来的Car模型来接收GeneralCarInfo的序列化实例。

      fixture.Customize<Car>(
          c => c.With(
              x => x.GeneralCarInfo,
              (CarInfo ci) => JsonDocument.Parse(JsonSerializer.Serialize(ci))));
      

      查看完整示例 here

      【讨论】:

        猜你喜欢
        • 2014-09-10
        • 1970-01-01
        • 2012-04-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多