模拟IScheduler进行单元测试

时间:2019-08-27 15:01:51

标签: c# asp.net-core dependency-injection rx.net

我正在尝试测试rx.net代码,而我对此完全感到困惑。 website中的一个示例非常有帮助,但是我无法连接最后一部分。下面是示例代码:

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>()

这个stackoverflow question很有帮助,但我仍然无法将所有内容拼凑起来:(

2 个答案:

答案 0 :(得分:0)

您将使用AsyncConversions。 像这样的东西

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

答案 1 :(得分:0)

出于某些有趣的原因,昨天我遇到了运行时错误,但现在一切正常。嗯!您可以使用:services.AddSingleton<IScheduler>(DefaultScheduler.Instance);代表TimeBasedOperations或遵循示例here

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