public static void AfterTest([NotNull] ITest testDetails) { var errors = new List <Exception>(); var test = testDetails.Method.MethodInfo; if (test.HasNunitAttributes()) { return; } var suiteName = test.GetSuiteName(); if (!suiteDescriptors.TryGetValue(suiteName, out var suiteDescriptor)) { throw new InvalidOperationException($"Suite context is not set for: {suiteName}"); } var methodContext = GroboTestContextHolder.ResetCurrentTestContext(); if (methodContext.IsSetUpped) { try { InvokeWrapperMethod(test.FindTearDownMethod(), testDetails.Fixture); } catch (Exception exception) { errors.Add(exception); } } var testName = testDetails.FullName; foreach (var methodWrapper in Enumerable.Reverse(test.GetMethodWrappers())) { if (!methodContext.SetUppedMethodWrappers.Contains(methodWrapper)) { continue; } try { methodWrapper.TearDown(testName, suiteDescriptor.SuiteContext, methodContext); } catch (Exception exception) { errors.Add(exception); } } if (!methodContext.TryDestroy(out var error)) { errors.Add(error); } if (errors.Count > 0) { var aggregateExceptionMessage = $"{errors.Count} TearDown methods failed."; var testResult = NUnitTestContext.CurrentContext.Result; if (testResult.Outcome.Status == TestStatus.Failed && testResult.Outcome.Site == FailureSite.Test) { aggregateExceptionMessage = $"Test method and {errors.Count} TearDown method(s) failed."; errors.Insert(0, new FailedTestException(testResult.Message, testResult.StackTrace)); } if (errors.Count == 1) { throw errors[0]; } throw new AggregateException(aggregateExceptionMessage, errors); } }
public static void BeforeTest([NotNull] ITest testDetails) { EnsureAppDomainInitialization(); var test = testDetails.Method.MethodInfo; test.EnsureNunitAttributesAbsence(); var fixtureType = test.GetFixtureType(); var testFixture = testDetails.Fixture; if (fixtureType != testFixture.GetType()) { throw new InvalidOperationException($"TestFixtureType mismatch for: {test.GetMethodName()}"); } var suiteName = test.GetSuiteName(); var suiteDescriptor = suiteDescriptors.GetOrAdd(suiteName, x => new SuiteDescriptor(suiteName, fixtureType.Assembly)); var suiteContext = suiteDescriptor.SuiteContext; var methodContext = new GroboTestMethodContextData(suiteDescriptor.LazyContainer); GroboTestContextHolder.SetCurrentContext(suiteContext, methodContext); var suiteWrappers = test.GetSuiteWrappers(); lock (suiteDescriptor) { foreach (var suiteWrapper in suiteWrappers) { if (suiteDescriptor.SetUpedSuiteWrappers.Contains(suiteWrapper)) { continue; } suiteWrapper.SetUp(suiteName, suiteDescriptor.TestAssembly, suiteContext); suiteDescriptor.SetUpedSuiteWrappers.Add(suiteWrapper); } } lock (testFixture) { if (IsFixtureNotSetuped(testFixture)) { var fixtureSetUpMethod = test.FindFixtureSetUpMethod(); if (fixtureSetUpMethod != null) { if (suiteName != fixtureType.FullName) { throw new InvalidOperationException($"GroboTestFixtureSetUp method is only allowed inside GroboTestFixture suite. Test: {test.GetMethodName()}"); } InvokeWrapperMethod(fixtureSetUpMethod, testFixture, suiteContext); } InjectFixtureFields(suiteContext, testFixture); } } var testName = testDetails.FullName; foreach (var methodWrapper in test.GetMethodWrappers()) { methodWrapper.SetUp(testName, suiteContext, methodContext); methodContext.SetUppedMethodWrappers.Add(methodWrapper); } InvokeWrapperMethod(test.FindSetUpMethod(), testFixture); methodContext.IsSetUpped = true; }