Будете ли вы создавать сервис для Rx.Observable? - PullRequest
0 голосов
/ 27 сентября 2011

У меня следующий код в ВМ ..

Observable
                    .Timer(remainingTimeSpanForNextHour, TimeSpan.FromHours(1))
                    .Timestamp()
                    .Subscribe( x => FillBookingData());

Мои вопросы ~

  1. Как вы думаете, нам нужно проверить этот код? Было бы похоже на то, что мы пытаемся протестировать Rx, если мы планируем протестировать этот код? может быть. мы должны просто протестировать только это значение

  2. Допустим, мы должны проверить этот код. Как вы думаете, это хорошая идея, чтобы создать сервис, как IObservableService?

Ответы [ 2 ]

2 голосов
/ 27 сентября 2011

Это всегда хорошая идея для тестирования вашего кода, но с наблюдаемыми может быть немного сложно, если весь ваш код находится в одном методе или блоке кода.

Вы должны попытаться выделить компоненты этого запроса - и для меня есть три компонента:

  1. Параметры
  2. Наблюдаемые
  3. Наблюдатель

Итак, напишите тесты, чтобы убедиться, что вы получаете правильные значения параметров.

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

Затем напишите тесты, чтобы убедиться, что наблюдатель работает.

Теперь, что касается написания интерфейса / реализации IObservableService, я думаю, что это не очень хорошая вещь. Вместо этого я бы сосредоточился на написании одного или нескольких сервисов, которые абстрагируют то, что вы пытаетесь сделать на функциональной основе, чтобы вы были СУХИМ (не повторяйте себя).

Итак, я думаю, что ITimerService может быть полезным.

public interface ITimerService
{
    IDisposable Subscribe(TimeSpan dueTime, TimeSpan period, Action action);
}

Очевидно, что оно разработано для использования с Rx - подпись похожа на Observable.Timer с крестиком IObservable.Subscribe. Он будет использовать ваш существующий запрос, просто сделанный для использования входных параметров.

Тестирование этого кода должно показаться вам довольно простым.

Дайте мне знать, если это хорошая отправная точка для вас.

1 голос
/ 28 сентября 2011

Тестировать таймер легко, используя Виртуальное время - вы можете игнорировать биты ReactiveUI, использовать AdvanceTo и найти способ внедрить используемый IScheduler в ваш код (Timer () и Timestamp() должны быть заданы ваши объекты TestScheduler)

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

...