Here's a few ideas.
1. Use property injection for IResults. All IResult implementations pass throught IoC.BuildUp to allow your container an opportunity to inject services. Only use the constructor for local parameter data.
2. When testing a coroutine, simply enumerate each result, one at a time. Do not call execute on your results. Remember, you are not testing the IResult implementation, but the coroutine implementation.
3. Check to make sure that the correct IResult is yielded and check any properties it has which would indicate it's correct/incorrect configuration.
4. Set any properties on the IResult which would have been set as a result of execution....but do not call execute.
5. Go to step 2
By doing this you will be able to "ignore" the async part of the coroutine (if it has one) by exerting direct control over the enumeration. You can even choose to stop enumerating at any point once you have confirmed that your test passes/fails.
You probably want to use several test methods to test a single coroutine implementation in order to keep individual tests simple and small.
Here's a simple sample class you might use to help in enumerating the results:
public class TestResultEnumerator
private readonly IEnumerator<IResult> _enumerator;
public TestResultEnumerator(IEnumerable<IResult> enumerator)
_enumerator = enumerator.GetEnumerator();
public T Next<T>()
where T : IResult