У меня есть это свойство:
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);
}
Есть ли способ, которым я могу предотвратить Отладку. Сбой, отображающий окно сообщения, когда я запускаю свои тесты, но позволяю этому показывать мне тот, когда я отлаживаю свое приложение?
Стандартный способ, которым я всегда это делал, - это создание подключаемого модуля для 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);
}
}
}
Вместо прямого вызова Debug.Assert вы можете вызвать метод-оболочку, который проверяет, подключен ли отладчик, перед вызовом Debug.Assert. (Предположительно, он должен выдать исключение, если к нему не подключен отладчик, чтобы ваши тесты завершились ошибкой.) Например:
[Conditional("DEBUG")]
public static void Assert(bool condition)
{
if (Debugger.IsAttached)
{
Debug.Assert(condition);
}
else
{
throw new SomeException();
}
}
Альтернативный способ, который не требует изменения вашего производственного кода или написания специальной надстройки 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);
}
}
}