1

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

        }
    }
}

問題は、実際にはダニが

300
400
500
600

それ以外の

100
200
300
400

ここで何が起こっているのかわかりません。

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>.

つまり、デフォルトのサブスクライブ ティックまで、実際にはコールド オブザーバブルをサブスクライブしません。Startメソッドを呼び出すティック、サブスクライブするティックなどを正確に指定するオーバーロードを使用します。

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 に答える