具有相等 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 };
将导致 StartDate
比 FinishDate
晚 (尽管只有几个刻度)。如果要将两者设置为相同,请请求一次日期并为 FinishDate
和 StartDate
设置相同的值:
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 日期。为您的测试使用固定日期。
我正在对带日期的请求进行单元测试。这些日期具有相同的时间戳,并且测试失败。使用不同的时间戳,测试 运行 很好,但是使用相同的时间戳,测试返回错误结果。
测试代码:
[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 };
将导致 StartDate
比 FinishDate
晚 (尽管只有几个刻度)。如果要将两者设置为相同,请请求一次日期并为 FinishDate
和 StartDate
设置相同的值:
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 日期。为您的测试使用固定日期。