我可以配置NUnit,以便在运行测试时Debug.Fail不显示消息框吗?

Gro*_*ile 8 c# debugging 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;
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

和这个单元测试

    [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);            
    }
Run Code Online (Sandbox Code Playgroud)

有没有办法可以阻止Debug.Fail在我运行测试时显示一个消息框,但是当我调试我的应用程序时允许它显示一个消息框?

Erg*_*wun 8

另一种不需要更改生产代码或编写自定义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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


Mar*_*son 2

我一直这样做的标准方法是为 NUnit 创建一个插件。该插件只是取消注册默认跟踪侦听器并注册一个替换,该替换在触发 Assert/Trace.Fail 时会引发异常。我喜欢这种方法,因为如果断言失败,测试仍然会失败,您不会弹出任何消息框,并且不必修改生产代码。

编辑——这是完整的插件代码。不过,您需要自己构建实际的插件 - 请查看 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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)