具有相等 DateTimeOffset 日期的单元测试返回错误

Unit test with equal DateTimeOffset dates returning error

我正在对带日期的请求进行单元测试。这些日期具有相同的时间戳,并且测试失败。使用不同的时间戳,测试 运行 很好,但是使用相同的时间戳,测试返回错误结果。

测试代码:

[Fact]
public void ShouldHaveValidationSuccessWhenStartDateIsLessOrEqualToFinishDate()
{
    //Arrange
    var request = new RegisterRequest { FinishDate = DateTimeOffset.UtcNow, StartDate = DateTimeOffset.UtcNow };
    var sut = new RegisterRequestValidator();

    //Act
    var result = sut.TestValidate(request);

    //Assert
    result.ShouldNotHaveValidationErrorFor(x => x.StartDate);
}

验证者代码:

public RegisterRequestValidator()
{
    RuleFor(req => req.StartDate).LessThanOrEqualTo(req => req.FinishDate).When(HasStartDate);
}

protected bool HasStartDate(RegisterRequest req) => req.StartDate != null;

注册请求代码:

public sealed class RegisterRequest : IRequest<OperationResult<IQueryable<EntityViewModel>>>
{
    public DateTimeOffset? StartDate { get; set; }
    public DateTimeOffset? FinishDate { get; set; }
}

我得到的错误是

Message: 
    FluentValidation.TestHelper.ValidationTestException : Expected no validation errors for property StartDate
    ----
    Validation Errors:
    [0]: 'Start Date' must be less than or equal to '07/11/2019 12:50:58 +00:00'.

为什么会这样?

像这样创建您的请求

var request = new RegisterRequest { FinishDate = DateTimeOffset.UtcNow, StartDate = DateTimeOffset.UtcNow };

将导致 StartDateFinishDate (尽管只有几个刻度)。如果要将两者设置为相同,请请求一次日期并为 FinishDateStartDate 设置相同的值:

var date = DateTimeOffset.UtcNow;
var request = new RegisterRequest { FinishDate = date, StartDate = date };

您从 DateTimeOffset.UtcNow 得到了不同的结果,因为它在 RegisterRequest 构造函数中被调用了两次。尝试:

var utcNow = DateTimeOffset.UtcNow;
var request = new RegisterRequest { FinishDate = utcNow, StartDate = utcNow };

因为这些不是同一个日期。你执行了两次DateTime.UtcNow,它们之间有细微的差别。如果您勾选 request.StartTime.Ticks 和 request.EndTime.Ticks,您会更容易看到它。

使用的日期不同。每次读取 UtcDate 时,您都会得到 current 日期。为您的测试使用固定日期。