VerifyTests/Verify项目中的日期时间处理机制详解

VerifyTests/Verify项目中的日期时间处理机制详解

Verify Verify - 一个快照工具,用于简化复杂数据模型和文档的断言,适合从事自动化测试和持续集成/持续部署(CI/CD)的程序员。 Verify 项目地址: https://gitcode.com/gh_mirrors/ve/Verify

概述

在自动化测试中,处理日期和时间是一个常见且具有挑战性的问题。VerifyTests/Verify项目提供了一套完善的解决方案,专门用于处理测试中涉及日期时间(DateTime, DateTimeOffset, DateOnly, 和 TimeOnly)的场景。本文将详细介绍该项目的日期时间处理机制及其使用方法。

默认行为

默认情况下,Verify会对所有日期时间值进行"清理"(scrubbing)操作。这种清理机制会:

  1. 自动检测测试数据中的所有日期时间值
  2. 为每个不同的日期时间值分配一个基于该日期的计数器
  3. 用这个计数器替换实际的日期时间值

这种设计确保了即使日期时间值发生变化,测试仍然可以重复执行。

示例代码:

[Fact]
public Task ReUseDatetime()
{
    var date = DateTime.Now;
    return Verify(new { date, same = date });
}

输出结果:

{
  date: "DateTime_1",
  same: "DateTime_1"
}

禁用日期清理功能

在某些情况下,可能需要保留原始的日期时间值。Verify提供了多种方式来禁用日期清理功能。

单个测试实例禁用

var settings = new VerifySettings();
settings.DontScrubDateTimes();

使用流畅API禁用

await Verify(target)
    .DontScrubDateTimes();

全局禁用

VerifierSettings.DontScrubDateTimes();

禁用日期计数功能

当测试中频繁调用当前日期时间时,日期计数行为可能会导致不一致的结果。此时可以禁用日期计数功能,改用简单的清理标记。

单个测试实例禁用

var settings = new VerifySettings();
settings.DisableDateCounting();

使用流畅API禁用

await Verify(target)
    .DisableDateCounting();

全局禁用

VerifierSettings.DisableDateCounting();

自定义日期格式处理

Verify允许开发者添加自定义的日期格式进行清理:

VerifierSettings.AddExtraDateTimeFormat("yyyy-MM-dd");

内联日期处理

Verify还能处理字符串中包含的内联日期时间值:

单个测试实例处理

var settings = new VerifySettings();
settings.ScrubInlineDateTimes();

使用流畅API处理

await Verify(target)
    .ScrubInlineDateTimes();

全局处理

VerifierSettings.ScrubInlineDateTimes();

命名日期时间处理

可以为特定的日期时间值指定名称,当这些值出现时会被匹配并替换为对应的名称:

单个测试实例命名

var settings = new VerifySettings();
settings.AddNamedDate(new(2000, 1, 1), "theDate");

使用流畅API命名

await Verify(target)
    .AddNamedDate(new(2000, 1, 1), "theDate");

全局命名

VerifierSettings.AddNamedDate(new(2000, 1, 1), "theDate");

自动推断名称

名称可以从变量名自动推断:

var theDate = new DateTime(2000, 1, 1);
await Verify(theDate)
    .AddNamedDate(theDate);

输出结果:

"theDate"

自定义比较器

Verify允许覆盖默认的日期时间比较器,以满足特殊需求:

DateTime比较器

默认比较器:

public static bool AreEqual(DateTime x, DateTime y)
    => x == y && x.Kind == y.Kind;

自定义比较器:

VerifierSettings.RegisterDateTimeComparer(
    (received, verified, _) => 
        Math.Abs((received - verified).TotalSeconds) < 1);

DateTimeOffset比较器

默认比较器:

public static bool AreEqual(DateTimeOffset x, DateTimeOffset y)
    => x == y;

自定义比较器:

VerifierSettings.RegisterDateTimeOffsetComparer(
    (received, verified, _) => 
        Math.Abs((received - verified).TotalSeconds) < 1);

TimeOnly比较器

默认比较器:

public static bool AreEqual(TimeOnly x, TimeOnly y)
    => x == y;

自定义比较器:

VerifierSettings.RegisterTimeOnlyComparer(
    (received, verified, _) => 
        Math.Abs((received - verified).TotalSeconds) < 1);

总结

VerifyTests/Verify项目提供了全面而灵活的日期时间处理方案,从基本的清理功能到高级的自定义比较器,能够满足各种测试场景的需求。通过合理使用这些功能,开发者可以构建出更加健壮和可靠的测试用例,有效解决测试中日期时间变化带来的问题。

Verify Verify - 一个快照工具,用于简化复杂数据模型和文档的断言,适合从事自动化测试和持续集成/持续部署(CI/CD)的程序员。 Verify 项目地址: https://gitcode.com/gh_mirrors/ve/Verify

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陆汝萱

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值