【问题标题】:How to customize DateTime format for AutoFixture?如何为 AutoFixture 自定义 DateTime 格式?
【发布时间】:2021-03-08 09:14:25
【问题描述】:

我目前有一个模型类产品:

public class ProductModel
{ 
  public string? ProductName{ get; set; }
  public DateTime ExpiryDate { get; set; }
}

我正在使用 XUnit 和 AutoFixture 进行单元测试:

下面是我的测试方法:

[Theory, AutoData]
public async Task SaveProduct_ShouldSaveProductToDatabase(ProductModel productModel)
{
  var expiry = productModel.ExpiryDate; // 2020-03-17 03:01:27.2166623
  ... implementation to save to database
}

Autofixture 用于自动生成日期,设置为 2020-03-17 03:01:27.2166623。有没有办法自定义 ProductModel 以特定格式返回模型属性。例如,我希望将返回的日期设置为 2020-03-17 03:01:27(无毫秒)。

我搜索了一些例子,找到了一个检索特定日期的例子:

public class AllProducts2020: ICustomization
{
    public void Customize(IFixture fixture)
    {
        fixture.Customize<ProductModel>(composer =>
        composer.With(p => p.ExpiryDate, new DateTime(2020, 1, 1)));
    }
}

上面实际上返回日期年份为 2020 的所有产品。我想使用上面的自定义类,除了我返回所有日期格式如下的产品:2020-03-17 03:01:27(没有毫秒)

任何提示如何实现这一点?

【问题讨论】:

    标签: c# xunit autofixture


    【解决方案1】:

    假设您熟悉 AutoFixture 自定义,您可以随时尝试创建自己的 DateTime 序列生成器(即 ISpecimenBuilder)。

    默认情况下,AutoFixture 使用随机数生成器生成DateTime 的总刻度值(请参阅RandomDateTimeSequenceGenerator)。 因为我们知道一秒钟有多少滴答声 (TimeSpan.TicksPerSecond)。您可以尝试添加/减去刻度增量,以将值沿所需方向四舍五入。

    完成样本生成器后,使用它自定义您的 Fixture 实例,您应该将 DateTime 值四舍五入到一秒。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多