Имитация IScheduler для модульного тестирования

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

class SomeClass 
{

  constructor(IScheduler scheduler)
  {
    var interval = Observable.Interval(TimeSpan.FromSeconds(1), scheduler)
      .Take(5);
  }

}

// So in my unit test project I'll inject a TestScheduler as below

public void Test_Some_Class()
{
   var scheduler = new TestScheduler();
   var instance = new SomeClass(scheduler);
   ...
}

Мой вопрос в моем файле запуска, какую реализацию IScheduler мне следует использовать:

services.AddSingleton<IScheduler, ConcreteImpl>()

Этот вопрос о переполнении стека был весьма полезным, но я м до сих пор не могу собрать все воедино :(


person David Blay    schedule 27.08.2019    source источник
comment
Scheduler.Default работает?   -  person Shlomo    schedule 27.08.2019
comment
Зачем вам регистрировать какой-либо стартап в рамках юнит-теста?   -  person grek40    schedule 27.08.2019
comment
Извините, но модульный тест находится в отдельном проекте. Я обновил вопрос, чтобы отразить это.   -  person David Blay    schedule 27.08.2019


Ответы (2)


Вы бы использовали AsyncConversions. Что-то вроде этого,

services.AddSingleton<IScheduler, SchedulerDefaults.AsyncConversions>()

person Ishraq Ahmad    schedule 27.08.2019

По какой-то интересной причине вчера у меня была ошибка во время выполнения, но сейчас все работает. Хм! Вы можете использовать: services.AddSingleton<IScheduler>(DefaultScheduler.Instance); вместо TimeBasedOperations или следовать примеру здесь

    public interface ISchedulerDefaults
    {
        IScheduler AsyncConversions { get; }
        IScheduler ConstantTimeOperations { get; }
        IScheduler Iteration { get; }
        IScheduler TailRecursion { get; }
        IScheduler TimeBasedOperations { get; }
    }

и укажите это вместо services.AddSingleton<ISchedulerDefaults, SchedulerDefaults>();

Для ваших модульных тестов вы можете использовать:

    public sealed class TestSchedulerDefaults : ISchedulerDefaults
    {
        private readonly TestScheduler _timeBasedOperations = new TestScheduler();
        private readonly TestScheduler _asyncConversions = new TestScheduler();
        private readonly  TestScheduler _constantTimeOperations = new TestScheduler();
        private  readonly TestScheduler _iteration = new TestScheduler();
        private  readonly TestScheduler _tailRecursion = new TestScheduler();

        IScheduler ISchedulerDefaults.AsyncConversions => new TestScheduler();
        IScheduler ISchedulerDefaults.ConstantTimeOperations => new TestScheduler();
        IScheduler ISchedulerDefaults.Iteration => new TestScheduler();
        IScheduler ISchedulerDefaults.TailRecursion => new TestScheduler();
        IScheduler ISchedulerDefaults.TimeBasedOperations => _timeBasedOperations;


        public IScheduler AsyncConversions => _asyncConversions;
        public IScheduler ConstantTimeOperations => _constantTimeOperations;
        public IScheduler Iteration => _iteration;
        public IScheduler TailRecursion => _tailRecursion;
        public TestScheduler TimeBasedOperations => _timeBasedOperations;
    }
person David Blay    schedule 28.08.2019
comment
Не слишком ли много планировщиков? У ReactiveUI всего два, потому что часто вас волнует только то, выполняются ли ваши задачи в фоновом режиме. или в основном потоке. - person Magnus; 06.09.2019
comment
Конечно, @Magnus, тебе определенно не нужно все. Я только что предоставил полную реализацию. - person David Blay; 10.09.2019