public async void Cancellation_TriggersCancellationTokenSource(Type messageTypeToCancelOn)
    {
        var testCase   = Mocks.ExecutionErrorTestCase("This is my error message");
        var messageBus = new SpyMessageBus(msg => !(messageTypeToCancelOn.IsAssignableFrom(msg.GetType())));
        var runner     = new ExecutionErrorTestCaseRunner(testCase, messageBus, aggregator, tokenSource);

        await runner.RunAsync();

        Assert.True(tokenSource.IsCancellationRequested);
    }
    public async void Messages()
    {
        var testCase = Mocks.ExecutionErrorTestCase("This is my error message");
        var runner   = new ExecutionErrorTestCaseRunner(testCase, messageBus, aggregator, tokenSource);

        var result = await runner.RunAsync();

        Assert.Equal(1, result.Total);
        Assert.Equal(0m, result.Time);
        Assert.Collection(messageBus.Messages,
                          msg =>
        {
            var testCaseStarting = Assert.IsAssignableFrom <ITestCaseStarting>(msg);
            Assert.Same(testCase.TestMethod.TestClass.TestCollection, testCaseStarting.TestCollection);
            Assert.Same(testCase, testCaseStarting.TestCase);
        },
                          msg =>
        {
            var testStarting = Assert.IsAssignableFrom <ITestStarting>(msg);
            Assert.Same(testCase.TestMethod.TestClass.TestCollection, testStarting.TestCollection);
            Assert.Same(testCase, testStarting.TestCase);
        },
                          msg =>
        {
            var failed = Assert.IsAssignableFrom <ITestFailed>(msg);
            Assert.Same(testCase.TestMethod.TestClass.TestCollection, failed.TestCollection);
            Assert.Same(testCase, failed.TestCase);
            Assert.Equal(0m, failed.ExecutionTime);
            Assert.Empty(failed.Output);
            var exceptionType = Assert.Single(failed.ExceptionTypes);
            Assert.Equal("System.InvalidOperationException", exceptionType);
            var type = Assert.Single(failed.Messages);
            Assert.Equal("This is my error message", type);
        },
                          msg =>
        {
            var testFinished = Assert.IsAssignableFrom <ITestFinished>(msg);
            Assert.Same(testCase.TestMethod.TestClass.TestCollection, testFinished.TestCollection);
            Assert.Same(testCase, testFinished.TestCase);
            Assert.Equal(0m, testFinished.ExecutionTime);
            Assert.Empty(testFinished.Output);
        },
                          msg =>
        {
            var testCaseFinished = Assert.IsAssignableFrom <ITestCaseFinished>(msg);
            Assert.Same(testCase.TestMethod.TestClass.TestCollection, testCaseFinished.TestCollection);
            Assert.Same(testCase, testCaseFinished.TestCase);
            Assert.Equal(0m, testCaseFinished.ExecutionTime);
            Assert.Equal(1, testCaseFinished.TestsRun);
            Assert.Equal(1, testCaseFinished.TestsFailed);
            Assert.Equal(0, testCaseFinished.TestsSkipped);
        }
                          );
    }