private static TestOutputs InjectTestOutputs(AppRunner runner) { TestOutputs outputs = new TestOutputs(); runner.Configure(c => c.UseMiddleware((context, next) => { context.InvocationPipeline.All .Select(i => i.Instance) .ForEach(instance => { instance.GetType() .GetProperties(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic) .Where(p => p.PropertyType == typeof(TestOutputs)) .ForEach(p => { // principal of least surprise // if the test class sets the instance, then use that instance var value = (TestOutputs)p.GetValue(instance); if (value == null) { p.SetValue(instance, outputs); } else { outputs.UseOutputsFromInstance(value); } }); }); return(next(context)); }, MiddlewareStages.PostBindValuesPreInvoke)); return(outputs); }
public AppRunnerResult(int exitCode, TestConsole testConsole, TestOutputs testOutputs, CommandContext commandContext) { _testConsole = testConsole; ExitCode = exitCode; TestOutputs = testOutputs; CommandContext = commandContext; }
internal void UseOutputsFromInstance(TestOutputs testOutputs) { if (Outputs.Count > 0) { throw new InvalidOperationException( $"cannot link to a {nameof(TestOutputs)} that already has outputs recorded. keys:{Outputs.Keys.ToOrderedCsv()}"); } Outputs = testOutputs.Outputs; }
private static TestOutputs InjectTestOutputs(AppRunner runner) { var outputs = new TestOutputs(); runner.Configure(c => { c.Services.Add(outputs); c.UseMiddleware(InjectTestOutputs, MiddlewareStages.PostBindValuesPreInvoke); }); return(outputs); }
public AppRunnerResult(int exitCode, TestConsole testConsole, TestOutputs testOutputs) { _testConsole = testConsole; ExitCode = exitCode; TestOutputs = testOutputs; }