Я могу настроить NUnit так, чтобы Отладка. Сбой не показывает окно сообщения, когда я запускаю свои тесты?

У меня есть это свойство:

    public SubjectStatus Status
    {
        get { return status; }
        set
        {
            if (Enum.IsDefined(typeof(SubjectStatus), value))
            {
                status = value;
            }
            else
            {
                Debug.Fail("Error setting Subject.Status", "There is no SubjectStatus enum constant defined for that value.");
                return;
            }
        }
    }

и этот модульный тест

    [Test]
    public void StatusProperty_StatusAssignedValueWithoutEnumDefinition_StatusUnchanged()
    {
        Subject subject = new TestSubjectImp("1");

        //  assigned by casting from an int to a defined value
        subject.Status = (SubjectStatus)2;
        Assert.AreEqual(SubjectStatus.Completed, subject.Status);            

        //  assigned by casting from an int to an undefined value
        subject.Status = (SubjectStatus)100;
        //  no change to previous value
        Assert.AreEqual(SubjectStatus.Completed, subject.Status);            
    }

Есть ли способ, которым я могу предотвратить Отладку. Сбой, отображающий окно сообщения, когда я запускаю свои тесты, но позволяю этому показывать мне тот, когда я отлаживаю свое приложение?

8
задан Grokodile 18 April 2010 в 11:20
поделиться

3 ответа

Стандартный способ, которым я всегда это делал, - это создание подключаемого модуля для NUnit. Плагин просто отменяет регистрацию прослушивателя трассировки по умолчанию и регистрирует замену, которая генерирует исключение при срабатывании Assert / Trace.Fail. Мне нравится этот подход, потому что тесты все равно не пройдут, если assert сработает, вы не увидите всплывающих окон с сообщениями и вам не придется изменять производственный код.

Edit - вот весь код плагина. Тем не менее, вы сами по себе для создания фактического плагина - посетите сайт NUnit :)

[NUnitAddin]
public class NUnitAssertionHandler : IAddin
{
    public bool Install(IExtensionHost host)
    {
        Debug.Listeners.Clear();
        Debug.Listeners.Add(new AssertFailTraceListener());
        return true;
    }

    private class AssertFailTraceListener : DefaultTraceListener
    {
        public override void Fail(string message, string detailMessage)
        {
            Assert.Fail("Assertion failure: " + message);
        }

        public override void Fail(string message)
        {
            Assert.Fail("Assertion failure: " + message);
        }
    }
}
2
ответ дан 5 December 2019 в 17:35
поделиться

Вместо прямого вызова Debug.Assert вы можете вызвать метод-оболочку, который проверяет, подключен ли отладчик, перед вызовом Debug.Assert. (Предположительно, он должен выдать исключение, если к нему не подключен отладчик, чтобы ваши тесты завершились ошибкой.) Например:

[Conditional("DEBUG")] 
public static void Assert(bool condition) 
{ 
    if (Debugger.IsAttached) 
    { 
        Debug.Assert(condition); 
    } 
    else 
    { 
        throw new SomeException(); 
    } 
}
0
ответ дан 5 December 2019 в 17:35
поделиться

Альтернативный способ, который не требует изменения вашего производственного кода или написания специальной надстройки NUnit, - это замена прослушивателей трассировки в приспособлении установки.

Например. Добавьте следующий класс в пространство имен, в котором находятся ваши тесты:

using System;
using System.Diagnostics;
using NUnit.Framework;

[SetUpFixture]
public class NUnitSetup
{
    // Field to hold exisitng trace listeners so they can be restored after test are run.
    private TraceListener[] originalListeners = null;

    // A trace listener to use during testing.
    private TraceListener nunitListener = new NUnitListener();

    [SetUp]
    public void SetUp()
    {
        // Replace existing listeners with listener for testing.
        this.originalListeners = new TraceListener[Trace.Listeners.Count];
        Trace.Listeners.CopyTo(this.originalListeners, 0);
        Trace.Listeners.Clear();
        Trace.Listeners.Add(this.nunitListener);
    }

    [TearDown]
    public void TearDown()
    {
        // Restore original trace listeners.
        Trace.Listeners.Remove(this.nunitListener);
        Trace.Listeners.AddRange(this.originalListeners);
    }

    public class NUnitListener : DefaultTraceListener
    {
        public override void Fail(string message)
        {
            Console.WriteLine("Ignoring Debug.Fail(\"{0}\")", message);
        }

        public override void Fail(string message, string detailMessage)
        {
            Console.WriteLine("Ignoring Debug.Fail(\"{0},{1}\")", message, detailMessage);
        }
    }
}
8
ответ дан 5 December 2019 в 17:35
поделиться
Другие вопросы по тегам:

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