/// <summary>
        /// Overridden to run the teardown methods specified on the test.
        /// </summary>
        /// <param name="context">The TestExecutionContext to be used.</param>
        /// <returns>A TestResult</returns>
        public override TestResult Execute(TestExecutionContext context)
        {
            TestResult suiteResult = context.CurrentResult;

            if (fixtureType != null)
            {
                MethodInfo[] teardownMethods =
                    Reflect.GetMethodsWithAttribute(fixtureType, typeof(TestFixtureTearDownAttribute), true);

                try
                {
                    int index = teardownMethods.Length;
                    while (--index >= 0)
                    {
                        MethodInfo fixtureTearDown = teardownMethods[index];
                        if (!fixtureTearDown.IsStatic && context.TestObject == null)
                        {
                            Console.WriteLine("TestObject should not be null!!!");
                        }
                        Reflect.InvokeMethod(fixtureTearDown, fixtureTearDown.IsStatic ? null : context.TestObject);
                    }

                    IDisposable disposable = context.TestObject as IDisposable;
                    if (disposable != null)
                    {
                        disposable.Dispose();
                    }
                }
                catch (Exception ex)
                {
                    // Error in TestFixtureTearDown or Dispose causes the
                    // suite to be marked as a error, even if
                    // all the contained tests passed.
                    NUnitException nex = ex as NUnitException;
                    if (nex != null)
                    {
                        ex = nex.InnerException;
                    }

                    // TODO: Can we move this logic into TestResult itself?
                    string message = "TearDown : " + ExceptionHelper.BuildMessage(ex);
                    if (suiteResult.Message != null)
                    {
                        message = suiteResult.Message + NUnit.Env.NewLine + message;
                    }

                    string stackTrace = "--TearDown" + NUnit.Env.NewLine + ExceptionHelper.BuildStackTrace(ex);
                    if (suiteResult.StackTrace != null)
                    {
                        stackTrace = suiteResult.StackTrace + NUnit.Env.NewLine + stackTrace;
                    }

                    // TODO: What about ignore exceptions in teardown?
                    suiteResult.SetResult(ResultState.Error, message, stackTrace);
                }
            }

            return(suiteResult);
        }
示例#2
0
        /// <summary>
        /// Does the one time tear down for a suite command.
        /// </summary>
        /// <param name="context">The execution context to use in running the test.</param>
        public virtual void DoOneTimeTearDown(TestExecutionContext context)
        {
            if (fixtureType != null)
            {
                TestSuiteResult suiteResult = context.CurrentResult as TestSuiteResult;

                try
                {
                    if (suite.OneTimeTearDownMethods != null)
                    {
                        int index = suite.OneTimeTearDownMethods.Length;
                        while (--index >= 0)
                        {
                            MethodInfo fixtureTearDown = suite.OneTimeTearDownMethods[index];
                            Reflect.InvokeMethod(fixtureTearDown, fixtureTearDown.IsStatic ? null : context.TestObject);
                        }
                    }

                    IDisposable disposable = context.TestObject as IDisposable;
                    if (disposable != null)
                    {
                        disposable.Dispose();
                    }
                }
                catch (Exception ex)
                {
                    // Error in TestFixtureTearDown or Dispose causes the
                    // suite to be marked as a error, even if
                    // all the contained tests passed.
                    NUnitException nex = ex as NUnitException;
                    if (nex != null)
                    {
                        ex = nex.InnerException;
                    }

                    // TODO: Can we move this logic into TestResult itself?
                    string message = "TearDown : " + ExceptionHelper.BuildMessage(ex);
                    if (suiteResult.Message != null)
                    {
                        message = suiteResult.Message + NUnit.Env.NewLine + message;
                    }

#if !NETCF_1_0
                    string stackTrace = "--TearDown" + NUnit.Env.NewLine + ExceptionHelper.BuildStackTrace(ex);
                    if (suiteResult.StackTrace != null)
                    {
                        stackTrace = suiteResult.StackTrace + NUnit.Env.NewLine + stackTrace;
                    }

                    // TODO: What about ignore exceptions in teardown?
                    suiteResult.SetResult(ResultState.Error, message, stackTrace);
#else
                    Result.SetResult(ResultState.Error, message);
#endif
                }
            }
        }
示例#3
0
        protected override void DoOneTimeTearDown(TestResult suiteResult)
        {
            try
            {
                _testContext.FixtureContext.GlobalSetupManager.Cleanup(_testContext.Position);
            }
            catch (Exception innerException)
            {
                NUnitException exception2 = innerException as NUnitException;
                if (exception2 != null)
                {
                    innerException = exception2.InnerException;
                }

                var shim = new TestResultShim();
                TestResultUtil.Error(shim, suiteResult.Test.GetMultilineName(), innerException, null, TestResultShim.Site.TearDown);
                NativeTestResult.ApplyToNunitResult(shim, suiteResult);
            }
        }
        public virtual void DoOneTimeTearDown(TestExecutionContext context)
        {
            if (fixtureType == null)
            {
                return;
            }
            TestSuiteResult testSuiteResult = context.CurrentResult as TestSuiteResult;

            try
            {
                if (suite.OneTimeTearDownMethods != null)
                {
                    int num = suite.OneTimeTearDownMethods.Length;
                    while (--num >= 0)
                    {
                        MethodInfo methodInfo = suite.OneTimeTearDownMethods[num];
                        Reflect.InvokeMethod(methodInfo, methodInfo.IsStatic ? null : context.TestObject);
                    }
                }
                (context.TestObject as IDisposable)?.Dispose();
            }
            catch (Exception innerException)
            {
                NUnitException ex = innerException as NUnitException;
                if (ex != null)
                {
                    innerException = ex.InnerException;
                }
                string text = "TearDown : " + ExceptionHelper.BuildMessage(innerException);
                if (testSuiteResult.Message != null)
                {
                    text = testSuiteResult.Message + Env.NewLine + text;
                }
                string text2 = "--TearDown" + Env.NewLine + ExceptionHelper.BuildStackTrace(innerException);
                if (testSuiteResult.StackTrace != null)
                {
                    text2 = testSuiteResult.StackTrace + Env.NewLine + text2;
                }
                testSuiteResult.SetResult(ResultState.Error, text, text2);
            }
        }
示例#5
0
        private static bool HandleException(Type fixtureType, Object instance, MethodInfo method, NUnitException e)
        {
            var caught = false;

            foreach (var field in from f in fixtureType.GetFields(
                         BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.Instance)
                     where f.FieldType.IsInstanceOfType(e.InnerException) &&
                     f.GetCustomAttributes(typeof(CatchException), true).OfType <CatchException>()
                     .Any(a => (a.ThrownFrom ?? fixtureType) == method.ReflectedType)
                     select f)
            {
                caught = true;
                if (instance == null && !field.IsStatic)
                {
                    throw new InvalidTestFixtureException(
                              string.Format("When you have nested-tests, [CatchException] field must be made static: {0}", field));
                }

                field.SetValue(instance, e.InnerException);
            }

            if (fixtureType != method.ReflectedType)
            {
                caught |= HandleException(fixtureType.DeclaringType, null, method, e);
            }

            return(caught);
        }