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



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

测试代码:

[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;

RegisterRequest代码:

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'.

为什么会发生这种情况?

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

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

创建这样的请求

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

将导致CCD_ 3比CCD_ 4晚(尽管只有几个刻度(。如果您想将两者设置为相同,请请求一次日期,并为FinishDateStartDate设置相同的值:

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

因为这些日期不同。您执行DateTime。UtcNow两次,两者之间略有不同。如果您检查了请求,您可以更容易地看到它。开始时间。滴答声和请求。结束时间。滴答声。

使用的日期不相同。每次读取UtcDate时,都会得到当前日期。使用固定日期进行测试。

最新更新