C# 如何在NUnit中处理抛出的异常
我已经为我的MVC项目用C语言编写了一个单元测试类 试验方法如下C# 如何在NUnit中处理抛出的异常,c#,asp.net-mvc,nunit,moq,C#,Asp.net Mvc,Nunit,Moq,我已经为我的MVC项目用C语言编写了一个单元测试类 试验方法如下 [Test] public void To_Add_DocumentStatusIsNull_ThrowsInvalidOperationException_ServiceTest() { try { _IDocumentStatusRepositoryMock = new Mock<IDocumentStatusRepository>();
[Test]
public void To_Add_DocumentStatusIsNull_ThrowsInvalidOperationException_ServiceTest()
{
try
{
_IDocumentStatusRepositoryMock = new Mock<IDocumentStatusRepository>();
_unitOfWorkMock = new Mock<IUnitOfWork>();
DocumentStatusService documentStatusService = new
DocumentStatusService(_unitOfWorkMock.Object,
_IDocumentStatusRepositoryMock.Object);
DocumentStatus documentStatus;
documentStatus = null;
_IDocumentStatusRepositoryMock.Setup(m => m.Add(documentStatus));
documentStatusService.Add(documentStatus);
Assert.Pass();
}
catch (Exception e)
{
throw new Exception(e.Message);
}
}
public virtual void Add(TEntity entity)
{
try
{
if (entity == null)
{
throw new ArgumentNullException("entity");
}
_repository.Add(entity);
}
catch (Exception e)
{
throw new Exception(e.Message);
}
}
现在由于服务类抛出ArgumentNullException,这个测试方法没有通过。那么如何处理ArgumentNullException或者如何使这个测试通过呢
如果您试图检查
ArgumentNullException
是否正常工作(当前不工作),请任何人提供帮助。那么听起来你想要:
[Test, ExpectedException(typeof(ArgumentNullException), ExpectedMessage = @"Value cannot be null.
Parameter name: entity")]
public void To_Add_DocumentStatusIsNull_ThrowsInvalidOperationException_ServiceTest()
{
_IDocumentStatusRepositoryMock = new Mock<IDocumentStatusRepository>();
_unitOfWorkMock = new Mock<IUnitOfWork>();
DocumentStatusService documentStatusService = new
DocumentStatusService(_unitOfWorkMock.Object,
_IDocumentStatusRepositoryMock.Object);
DocumentStatus documentStatus;
documentStatus = null;
_IDocumentStatusRepositoryMock.Setup(m => m.Add(documentStatus));
documentStatusService.Add(documentStatus);
}
我假设:看看这个单元测试不应该通过的代码。在大多数情况下,向列表中添加空值不是预期的行为 我看到两种选择: A) 你应该给你的测试方法添加一个try/catch
try
{
_IDocumentStatusRepositoryMock.Setup(m => m.Add(documentStatus));
documentStatusService.Add(documentStatus);
}
catch (Exception )
{
Assert.Fail(); // or nothing is expected behaviour
}
B) 从测试方法中删除try/catch块,这样您就不会接受异常。(每个未失败的测试或断言或thows未处理异常自动通过)ArgumentNullException测试 如果你删除了这个不明智的
catch (Exception e)
{
throw new Exception(e.Message);
}
从要测试的代码(当前的catch
会丢失错误的上下文,并中断堆栈跟踪,请参见下文),测试可以非常简单,只需将调用包装在Assert.Throws()中即可:
更好的方法:如果您确实捕获并重新播放了一些值,请将原始内容包装为内部异常:
catch (SqlException ex)
{
throw new Exception("Some value add here", ex);
}
或者,如果您只是拦截并允许传播:
catch (SqlException)
{
// Do some logging
throw;
}
对我来说,最好是让异常传播,除非你要么添加值,要么处理它。抛出新异常(e.Message)的目的是什么代码>在您的服务方法中?你为什么不让最初的例外被提出呢?我看不出这有什么用。try
/catch
设置。。。?在所示的NUnit测试中,try
/catch
毫无意义-NUnit会自动将异常视为错误,除非您指出了已知的预期异常Corry,这是为了其他目的而写的,你是对的,这是不正确的。现在我想知道如何在我的测试方法中处理ArgumentNullException?是的,这个单元测试不应该通过,但我不知道如何操作它。我尝试了上面给出的解决方案,没有任何改变。请问还有其他解决方案吗?我测试了上面给出的代码,但没有任何改变。我这么多都是为了回答您的问题。这不是一个正确的答案,因为我想能够区分NUnit Framework 3中的错误和我正在测试的代码中的错误。我该如何去捕捉NUnit框架中不断遇到的bug,并适当地标记测试?@SuLlewellyn仅仅因为你想做一些不同的事情并不意味着这个答案是错误的;但是:您也许可以捕获被抛出的NUnitException
或任何东西,并单独处理它?虽然真的,除非你真的在调试nunit,我不认为这是一个真正需要解决的问题Hanks,Marc。我检查了NUnit代码,但它不包含NUnitException。它依赖于标准的异常类,这意味着区分可能很困难。我不应该因为NUnit有bug而考试不及格。
catch (Exception e)
{
throw new Exception(e.Message);
}
catch (SqlException ex)
{
throw new Exception("Some value add here", ex);
}
catch (SqlException)
{
// Do some logging
throw;
}