Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在NUnit中处理抛出的异常_C#_Asp.net Mvc_Nunit_Moq - Fatal编程技术网

C# 如何在NUnit中处理抛出的异常

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>();

我已经为我的MVC项目用C语言编写了一个单元测试类

试验方法如下

 [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;
 }