in src/Microsoft.VisualStudio.Extensibility.Testing.Xunit.Shared/Harness/IdeTestAssemblyRunner.cs [381:433]
public bool OnMessage(IMessageSinkMessage message)
{
if (message is ITestAssemblyFinished testAssemblyFinished)
{
// The test cases in the ITestAssemblyFinished message are remote proxies, but the objects won't be
// used until after the remote process terminates. Recreate the objects in the current process (or
// map them to an equivalent object already in the current process) to avoid using objects that are
// no longer available.
var testCases = testAssemblyFinished.TestCases.Select(testCase =>
{
if (_knownTestCasesByUniqueId.TryGetValue(testCase.UniqueID, out var knownTestCase))
{
return knownTestCase;
}
else if (testCase is IdeTestCase ideTestCase)
{
return new IdeTestCase(this, ideTestCase.DefaultMethodDisplay, ideTestCase.DefaultMethodDisplayOptions, ideTestCase.TestMethod, ideTestCase.VisualStudioInstanceKey, ideTestCase.TestMethodArguments);
}
else if (testCase is IdeTheoryTestCase ideTheoryTestCase)
{
return new IdeTheoryTestCase(this, ideTheoryTestCase.DefaultMethodDisplay, ideTheoryTestCase.DefaultMethodDisplayOptions, ideTheoryTestCase.TestMethod, ideTheoryTestCase.VisualStudioInstanceKey, ideTheoryTestCase.TestMethodArguments);
}
else if (testCase is IdeInstanceTestCase ideInstanceTestCase)
{
return new IdeInstanceTestCase(this, ideInstanceTestCase.DefaultMethodDisplay, ideInstanceTestCase.DefaultMethodDisplayOptions, ideInstanceTestCase.TestMethod, ideInstanceTestCase.VisualStudioInstanceKey, ideInstanceTestCase.TestMethodArguments);
}
else
{
return new XunitTestCase(this, TestMethodDisplay.ClassAndMethod, TestMethodDisplayOptions.None, testCase.TestMethod, testCase.TestMethodArguments);
}
});
TestAssemblyFinished = new TestAssemblyFinished(testCases.ToArray(), testAssemblyFinished.TestAssembly, testAssemblyFinished.ExecutionTime, testAssemblyFinished.TestsRun, testAssemblyFinished.TestsFailed, testAssemblyFinished.TestsSkipped);
return !_cancellationToken.IsCancellationRequested;
}
else if (message is ITestCaseStarting testCaseStarting)
{
CurrentTestCase = DataCollectionService.GetTestName(testCaseStarting.TestCase);
return _messageSink.OnMessage(message);
}
else if (message is ITestCaseFinished testCaseFinished)
{
CurrentTestCase = null;
_completedTestCaseIds.Add(testCaseFinished.TestCase.UniqueID);
return !_cancellationToken.IsCancellationRequested;
}
else if (message is ITestAssemblyStarting)
{
return !_cancellationToken.IsCancellationRequested;
}
return _messageSink.OnMessage(message);
}