具有相等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'.

为什么会这样?

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

您得到的结果与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 };

将导致StartDateFinishDate更晚(emem)(尽管只有几个滴答声)。如果要将两者设置为相同,请一次请求日期,然后为FinishDateStartDate设置相同的值:

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

因为这些日期不同。您执行两次DateTime.UtcNow,它们之间有细微的差别。如果选中了request.StartTime.Ticks和request.EndTime.Ticks,则可以更轻松地看到它。

,

使用的日期不同。每次阅读UtcDate时,您都会获得当前日期。为测试使用固定的日期。

本文链接:https://www.f2er.com/3143773.html

大家都在问