コード例 #1
0
    public async Task HandlesExceptionsThrownImmediatelyByInnerPublisher()
    {
        const int expectedResult   = 42;
        var       exceptionToThrow = new PublishException();
        var       exceptionsThrown = new List <Exception>();

        var innerPublisher = Substitute.For <IResultPublisher>();

        innerPublisher.Publish(Arg.Any <Result <int, int> >())
        .Throws(exceptionToThrow);

        var fireAndForgetPublisher = new FireAndForgetResultPublisher(innerPublisher, ex => { exceptionsThrown.Add(ex); });

        var mock = Substitute.For <IControlCandidate <int, string> >();

        mock.Control().Returns(expectedResult);
        mock.Candidate().Returns(expectedResult);

        using (Swap.Publisher(fireAndForgetPublisher))
        {
            var result = Scientist.Science <int>("myExperiment", experiment =>
            {
                experiment.Use(mock.Control);
                experiment.Try(mock.Candidate);
            });
        }

        await fireAndForgetPublisher.WhenPublished();

        Assert.Equal(new List <Exception> {
            exceptionToThrow
        }, exceptionsThrown);
    }
コード例 #2
0
    public async Task HandlesExceptionsThrownImmediatelyByInnerPublisher()
    {
        const int expectedResult = 42;
        var exceptionToThrow = new PublishException();
        var exceptionsThrown = new List<Exception>();

        var innerPublisher = Substitute.For<IResultPublisher>();
        innerPublisher.Publish(Arg.Any<Result<int, int>>())
            .Throws(exceptionToThrow);

        var fireAndForgetPublisher = new FireAndForgetResultPublisher(innerPublisher, ex => { exceptionsThrown.Add(ex); });

        var mock = Substitute.For<IControlCandidate<int, string>>();
        mock.Control().Returns(expectedResult);
        mock.Candidate().Returns(expectedResult);

        using (Swap.Publisher(fireAndForgetPublisher))
        {
            var result = Scientist.Science<int>("myExperiment", experiment =>
            {
                experiment.Use(mock.Control);
                experiment.Try(mock.Candidate);
            });
        }

        await fireAndForgetPublisher.WhenPublished();

        Assert.Equal(new List<Exception> { exceptionToThrow }, exceptionsThrown);
    }
コード例 #3
0
    public async Task HandlesDelayedExceptionsThrownByInnerPublisher()
    {
        const int expectedResult   = 42;
        var       exceptionToThrow = new PublishException();
        var       exceptionsThrown = new List <Exception>();

        var pendingPublishTask = new TaskCompletionSource <object>();
        var innerPublisher     = Substitute.For <IResultPublisher>();

        innerPublisher.Publish(Arg.Any <Result <int, int> >())
        .Returns(call => pendingPublishTask.Task.ContinueWith(_ => { throw exceptionToThrow; }));

        var fireAndForgetPublisher = new FireAndForgetResultPublisher(innerPublisher, ex => { exceptionsThrown.Add(ex); });

        var mock = Substitute.For <IControlCandidate <int, string> >();

        mock.Control().Returns(expectedResult);
        mock.Candidate().Returns(expectedResult);

        using (Swap.Publisher(fireAndForgetPublisher))
        {
            var result = Scientist.Science <int>("myExperiment", experiment =>
            {
                experiment.Use(mock.Control);
                experiment.Try(mock.Candidate);
            });
        }

        var whenPublished = fireAndForgetPublisher.WhenPublished();

        Assert.False(whenPublished.IsCompleted, "When Published Task completed early.");

        pendingPublishTask.SetResult(null);

        await whenPublished;

        Assert.True(whenPublished.IsCompleted, "When Published Task isn't complete.");

        Assert.Equal(new List <Exception> {
            exceptionToThrow
        }, exceptionsThrown);
    }
コード例 #4
0
    public async Task HandlesDelayedExceptionsThrownByInnerPublisher()
    {
        const int expectedResult = 42;
        var exceptionToThrow = new PublishException();
        var exceptionsThrown = new List<Exception>();

        var pendingPublishTask = new TaskCompletionSource<object>();
        var innerPublisher = Substitute.For<IResultPublisher>();
        innerPublisher.Publish(Arg.Any<Result<int, int>>())
            .Returns(call => pendingPublishTask.Task.ContinueWith(_ => { throw exceptionToThrow; }));

        var fireAndForgetPublisher = new FireAndForgetResultPublisher(innerPublisher, ex => { exceptionsThrown.Add(ex); });

        var mock = Substitute.For<IControlCandidate<int, string>>();
        mock.Control().Returns(expectedResult);
        mock.Candidate().Returns(expectedResult);

        using (Swap.Publisher(fireAndForgetPublisher))
        {
            var result = Scientist.Science<int>("myExperiment", experiment =>
            {
                experiment.Use(mock.Control);
                experiment.Try(mock.Candidate);
            });
        }

        var whenPublished = fireAndForgetPublisher.WhenPublished();

        Assert.False(whenPublished.IsCompleted, "When Published Task completed early.");

        pendingPublishTask.SetResult(null);

        await whenPublished;

        Assert.True(whenPublished.IsCompleted, "When Published Task isn't complete.");

        Assert.Equal(new List<Exception> { exceptionToThrow }, exceptionsThrown);
    }