Планировщик модульного тестирования в БУДУЩЕМ C # - PullRequest
4 голосов
/ 04 февраля 2011

Я использую quartz.NET внутри проекта планировщика (библиотеки классов) в моем приложении, потому что я хочу, чтобы другие проекты не зависели от фактической реализации. В будущем, если я захочу поменять кварц на Castle Scheduler, Windows Scheduler или другое ... у меня будет возможность изменить его.

Мне нужно еженедельно тестировать триггеры на моем проекте Quartz.NET, я начал исследовать и выяснил, что в данный момент кажется классным решением MOLES это расширение в основном позволяет мне изменять DateTime. Теперь иди в будущее!

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

Причина, по которой я хочу идти в будущее, заключается в том, что в приложении я использую разные методы / триггеры для каждого типа запроса E.G. Еженедельно, Еженедельно с повторением, Ежемесячно, Ежегодно

Кто-нибудь еще Юнит проверил такой сценарий?

Есть ли что-то, что я прохожу мимо?

Возможно ли это с MOLES?

Ответы [ 2 ]

5 голосов
/ 05 февраля 2011

Как насчет реализации чего-то вроде

public interface IClock
{
    DateTime Now { get; }
}

public class FakeClock : IClock
{
    DateTime Now { get; set; }
}

public class SystemClock : IClock
{
    DateTime Now { get { return DateTime.Now; } }
}

Когда вы разрабатываете фасад, вы можете сделать свой код зависимым от IClock, заменяя каждый вызов DateTime.Now на IClock.Now.

Зависимость IClock может быть передана как параметр конструктора или непосредственно каждому методу, который требует этого.

Тогда ваш рабочий код будет использовать экземпляр SystemClock, и ваши тесты могут полагаться на тип FakeClock, чтобы манипулировать временем и проверять, что какая-то операция do происходит в ожидаемый момент.

Такой тип дизайна (Inversion of Control) значительно выигрывает от работы с контейнером внедрения зависимостей, таким как Castle Windsor, StructureMap, AutoFac, ...

Примечание: Для дальнейшего ознакомления аналогичное предложение по реализации обсуждается в этой публикации .

1 голос
/ 01 апреля 2011

Я еще не проверял это, но когда вы попробовали Moles, вы изменили DateTimeOffset или DateTime?Quartz.Net использует DateTimeOffset.UtcNow:

https://fisheye3.atlassian.com/browse/quartznet/src/Quartz/SystemTime.cs?hb=true

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

SystemTime.UtcNow = () => new DateTimeOffset(DateTime.Now.AddDays(5)).UtcNow

когда вы хотите быть через пять дней:)

Обратите внимание, что для функциональности SystemTime требуется, чтобы вы собирали Quartz из исходного кода, вы можете получить исходный код по адресуgithub:

https://github.com/lahma/quartznet

...