我正在为一个带有日期的请求进行单元测试。这些日期具有相同的时间戳,并且测试失败。使用不同的时间戳,测试运行良好,但使用相同的时间戳时,测试返回错误结果。
测试代码:
[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晚(尽管只有几个刻度(。如果您想将两者设置为相同,请请求一次日期,并为FinishDate
和StartDate
设置相同的值:
var date = DateTimeOffset.UtcNow;
var request = new RegisterRequest { FinishDate = date, StartDate = date };
因为这些日期不同。您执行DateTime。UtcNow两次,两者之间略有不同。如果您检查了请求,您可以更容易地看到它。开始时间。滴答声和请求。结束时间。滴答声。
使用的日期不相同。每次读取UtcDate时,都会得到当前日期。使用固定日期进行测试。