Обработка DateTimeOffset 28 февраля - PullRequest
0 голосов
/ 29 мая 2018

У меня тест, который сегодня не пройден (29 мая).Это довольно простой тест, который проверяет, что что-то было приобретено за последние 3 месяца, он проходит в соответствии с ...

var purchaseDate = DateTimeOffset.Now.AddMonths(-3); // returns the 28th of February
Assert.True(purchaseDate.AddMonths(3).Date >= DateTimeOffset.Now.Date) // 28th of February + 3 months is the 28th of May

Этот тест не проходит только сегодня.

Яесли предположить, что с этой проблемой уже сталкивались много раз, то есть ли способ справиться с ней без переключения логики 29 мая?

1 Ответ

0 голосов
/ 29 мая 2018

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

Давайте рассмотрим пример с этим небольшим сервисом, который у вас может быть:
(используйте все, что вам нравится в качестве DI)

public class MyService {

    // Private variables that will be initialized by constructor

    private readonly DateTimeOffset now;

    public MyService(MyFirstDependency dependency, DateTimeOffset now = DateTimeOffset.Now) {
         // Assign here your private variables
         this.now = now;
    }


    public void ValidateDateIsNotBefore3MonthsAgo(DateTimeOffset myDateToValidate) {
        if (!myDateToValidate.AddMonths(3).Date >= now.Date) {
             throw new WhateverYouWantException("Date is before 3 months ago");
        }
    }

}

Таким образом, когда вы создаете экземпляры своих тестов, вы можете передать DateTimeOffset со значением по вашему выбору.Вы больше не зависите от текущей даты.

edit : я забыл, что вы также можете использовать Fakes , чтобы высмеивать текущую дату без необходимости изменять ваш код,но доступно не для всех версий Visual Studio

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...