Модульный тест с одинаковой ошибкой возврата даты DateTimeOffset - PullRequest
2 голосов
/ 07 ноября 2019

Я делаю юнит-тест для запроса с датами. Эти даты имеют одинаковые временные метки, и тест не пройден. С разными временными метками тест работает хорошо, но с одинаковыми временными метками тест возвращает результат ошибки.

Код для теста:

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

Почему это происходит?

Ответы [ 4 ]

3 голосов
/ 07 ноября 2019

Вы получаете другой результат от DateTimeOffset.UtcNow, потому что он вызывается дважды в конструкторе RegisterRequest. Попробуйте:

var utcNow = DateTimeOffset.UtcNow;
var request = new RegisterRequest { FinishDate = utcNow, StartDate = utcNow };
1 голос
/ 07 ноября 2019

Используемые даты не совпадают . Каждый раз, когда вы читаете UtcDate, вы получаете текущую дату. Используйте постоянную дату для ваших тестов.

1 голос
/ 07 ноября 2019

Потому что это не одинаковые даты. Вы выполняете DateTime.UtcNow дважды, и между ними есть небольшая разница. Вы могли бы видеть это легче, если бы вы проверили request.StartTime.Ticks и request.EndTime.Ticks.

1 голос
/ 07 ноября 2019

Создание вашего запроса следующим образом

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 };
...