我目前正在通过C#课程进行单元测试-专门针对NUnit(我正在将NUnit 3.8.1与NUnit3TestAdapter 3.1.13结合使用)。
我的问题是,当我测试要抛出的异常时,调试器会停止并在要测试的方法上抛出异常。我不确定自己是否误解了行为,但看不到自己做错了什么。
首先-我已经阅读了documentation,看不到问题。
我还浏览了堆栈溢出中的其他各种帖子,这些帖子似乎并没有完全指出答案,因为这些解决方案都不适合我。
Is there some Assert method which can be used for unit test on whether a method throws an exception?
C# Unit Testing - Test method throwing NullReferenceException
我正在测试的课程如下(由该课程的讲师提供-他们证明了这是可行的)。
using System;
namespace TestNinja.Fundamentals
{
public class ErrorLogger
{
public string LastError { get; set; }
public event EventHandler<Guid> ErrorLogged;
public void Log(string error)
{
if (String.IsNullOrWhiteSpace(error))
throw new ArgumentNullException();
LastError = error;
// Write the log to a storage
// ...
ErrorLogged?.Invoke(this, Guid.NewGuid());
}
}
}
最后,我的测试方法-
using NUnit.Framework;
using TestNinja.Fundamentals;
namespace TestNinja.UnitTests
{
[TestFixture]
public class ErrorLoggerTests
{
//private ErrorLogger _errorLogger;
[SetUp]
public void SetUp()
{
//_errorLogger = new ErrorLogger();
}
[Test]
public void Log_WhenCalled_SetTheLastErrorProperty()
{
var logger = new ErrorLogger();
logger.Log("a");
Assert.That(logger.LastError, Is.EqualTo("a"));
}
[Test]
[TestCase(null)]
[TestCase("")]
[TestCase(" ")]
public void Log_InvalidError_ThrowArgumentNullException(string error)
{
var logger = new ErrorLogger();
Assert.That(() => logger.Log(error), Throws.ArgumentNullException);
}
}
}
我正在谈论的测试是Log_InvalidError_ThrowArgumentNullException
。在每个测试用例中,代码在throw new ArgumentNullException();
中的行ErrorLogger
处中断。我必须关闭包装盒并继续运行代码。
当我单独运行此测试时,该测试将运行到完成,但是当我全部运行该测试时,将引发异常并停止测试。
最初,我的单元测试没有使用SetUp
方法,并且我正在使用该私有字段,但是我换了一个新实例,以确保对象的持久性没有任何问题。