1

I have a simple unit test to understand ReactiveTest

using Microsoft.Reactive.Testing;
using Xunit;
using FluentAssertions;
using System.Reactive.Linq;

namespace Utils.Spec
{
    public class SelectWithCancelationSpec : ReactiveTest
    {
        [Fact]
        public void Foo()
        {
            var sched = new TestScheduler();
            var o = sched.CreateColdObservable
                ( OnNext(100, 10)
                , OnNext(200, 20)
                , OnNext(300, 30)
                , OnNext(400, 40)
                );

            var actual = sched.Start(() => {
                return o.Select(i=>i+1);
            });

            var expected = new [] 
                { OnNext(100, 11)
                , OnNext(200, 21)
                , OnNext(300, 31)
                , OnNext(400, 41)
                };

            expected.ShouldBeEquivalentTo(actual.Messages);

        }
    }
}

Problem is that in actual the ticks are

300
400
500
600

instead of

100
200
300
400

I'm not sure what is happening here.

4

1 回答 1

3

XML 文档Start说:

/// Starts the test scheduler and uses default virtual times to <see
  cref="F:Microsoft.Reactive.Testing.ReactiveTest.Created">invoke the
factory function</see>, to <see
cref="F:Microsoft.Reactive.Testing.ReactiveTest.Subscribed">subscribe to the
resulting sequence</see>, and to <see
cref="F:Microsoft.Reactive.Testing.ReactiveTest.Disposed">dispose the
subscription</see>.

这意味着它实际上不会订阅您的冷 observable,直到默认订阅刻度。使用导致Start您准确指定调用您的方法的刻度、订阅的刻度等的重载。

或者只是自己订阅 observable,然后Start不带参数调用让它运行。

**根据此答案中给出的帮助编辑解决方案**

    [Fact]
    public void Foo()
    {
        var sched = new TestScheduler();
        var o = sched.CreateHotObservable
            ( OnNext(100, 10)
            , OnNext(200, 20)
            , OnNext(300, 30)
            , OnNext(400, 40)
            );

        var actual = sched.Start(() => {
            return o.Select(i=>i+1);
        }
        , created: 0
        , subscribed:1
        , disposed:500
        );

        var expected = new [] 
            { OnNext(100, 11)
            , OnNext(200, 21)
            , OnNext(300, 31)
            , OnNext(400, 41)
            };

        actual.Messages.ShouldBeEquivalentTo(expected);

    }
于 2013-07-24T15:44:58.827 回答