NUnit, is it possible to continue executing test after Assert fails?

前端 未结 9 2162
伪装坚强ぢ
伪装坚强ぢ 2020-12-29 19:42

In a test that contains some asserts, for example:

Assert.AreEqual(1,1);
Assert.AreEqual(2,1);
Assert.AreEqual(2,2);

is it possible to let

9条回答
  •  粉色の甜心
    2020-12-29 20:17

    I prefer to be practical and put several related assertions in one method.

    I have a helper class which enables the following syntax (I use):

    AssertAll.Succeed(
        () => Assert.AreEqual("bb", id.Context),
        () => Assert.AreEqual("abc", id.FullName),
        () => Assert.AreEqual("b", id.SessionID));
    

    which gives me error messages like this:

    Assert.AreEqual failed. Expected:. Actual:. 
    Assert.AreEqual failed. Expected:. Actual:<[b\c]a{103}>. 
    at FXP_COM.Tests.EnumToStringConverterterTests.<>c__DisplayClass3.b__0() in UnitTest1.cs: line 31
    at FXP_COM.Tests.AssertAll.Succeed(Action[] assertions) in UnitTest1.cs: line 46 at FXP_COM.Tests.AssertAll.Succeed(Action[] assertions) in UnitTest1.cs: line 62
    at FXP_COM.Tests.EnumToStringConverterterTests.ShouldConvert() in UnitTest1.cs: line 30
    

    and the helper class is the following:

    using System;
    using NUnit.Framework;
    using System.Collections.Generic;
    using System.Linq;
    using System.Reflection;
    
    public static class AssertAll
    {
        public static void Succeed(params Action[] assertions)
        {
            var errors = new List();
    
            foreach (var assertion in assertions)
                try
                {
                    assertion();
                }
                catch (Exception ex)
                {
                    errors.Add(ex);
                }
    
            if (errors.Any())
            {
                var ex = new AssertionException(
                    string.Join(Environment.NewLine, errors.Select(e => e.Message)),
                    errors.First());
    
                // Use stack trace from the first exception to ensure first
                // failed Assert is one click away
                ReplaceStackTrace(ex, errors.First().StackTrace);
    
                throw ex;
            }
        }
    
        static void ReplaceStackTrace(Exception exception, string stackTrace)
        {
            var remoteStackTraceString = typeof(Exception)
                .GetField("_remoteStackTraceString",
                    BindingFlags.Instance | BindingFlags.NonPublic);
    
            remoteStackTraceString.SetValue(exception, stackTrace);
        }
    }
    

提交回复
热议问题