Можно ли смоделировать сбой теста NUnit без изменения кода каждого теста и / или прибора?

с записями к предыдущему ответу @Bronek и @Shimmy

Это я сделал что-то в ASP.NET Core

<input asp-for="DisabledField" disabled="disabled" />
<input asp-for="DisabledField" class="hidden" />

. Первый вход - только для чтения и второй передает значение Контроллеру и скрыт. Надеюсь, это будет полезно для кого-то, кто работает с ASP.Net Core.

0
задан mark 20 March 2019 в 04:03
поделиться

1 ответ

Я нашел решение:

using NUnit.Framework;
using NUnit.Framework.Interfaces;
using NUnit.Framework.Internal;
using System;
using System.Reflection;

[assembly: Common.EnableFailureSimulation]

namespace Common
{
    public class SimulateFailureMethodInfoWrapper : IMethodInfo
    {
        private readonly IMethodInfo m_mi;

        public SimulateFailureMethodInfoWrapper(IMethodInfo mi)
        {
            m_mi = mi;
        }

        public ITypeInfo TypeInfo => m_mi.TypeInfo;

        public MethodInfo MethodInfo => m_mi.MethodInfo;

        public string Name => m_mi.Name;

        public bool IsAbstract => m_mi.IsAbstract;

        public bool IsPublic => m_mi.IsPublic;

        public bool ContainsGenericParameters => m_mi.ContainsGenericParameters;

        public bool IsGenericMethod => m_mi.IsGenericMethod;

        public bool IsGenericMethodDefinition => m_mi.IsGenericMethodDefinition;

        public ITypeInfo ReturnType => m_mi.ReturnType;

        public T[] GetCustomAttributes<T>(bool inherit) where T : class => m_mi.GetCustomAttributes<T>(inherit);

        public Type[] GetGenericArguments() => m_mi.GetGenericArguments();

        public IParameterInfo[] GetParameters() => m_mi.GetParameters();

        public object Invoke(object fixture, params object[] args)
        {
            var res = m_mi.Invoke(fixture, args);
            Assert.Fail("Failure simulation");
            return res;
        }

        public bool IsDefined<T>(bool inherit) where T : class => m_mi.IsDefined<T>(inherit);

        public IMethodInfo MakeGenericMethod(params Type[] typeArguments) => m_mi.MakeGenericMethod(typeArguments);
    }

    [AttributeUsage(AttributeTargets.Assembly)]
    public class EnableFailureSimulationAttribute : Attribute, ITestAction
    {
        private static string s_failTestMethod = GetParameterByName("!");

        public ActionTargets Targets => ActionTargets.Test;

        public void AfterTest(ITest test)
        {
        }

        public void BeforeTest(ITest test)
        {
            if (test.MethodName == s_failTestMethod && test is Test testImpl)
            {
                testImpl.Method = new SimulateFailureMethodInfoWrapper(testImpl.Method);
                s_failTestMethod = "!";
            }
        }
    }
}

Альтернативным подходом было бы использование Moq и макет интерфейса IMethodInfo вместо реального класса SimulateFailureMethodInfoWrapper.

В любом случае, это, кажется, работает отлично.

0
ответ дан mark 20 March 2019 в 04:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: