Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.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# 应在测试中出现异常,但仍要验证dispose是否被调用_C#_Unit Testing_Nunit_Moq - Fatal编程技术网

C# 应在测试中出现异常,但仍要验证dispose是否被调用

C# 应在测试中出现异常,但仍要验证dispose是否被调用,c#,unit-testing,nunit,moq,C#,Unit Testing,Nunit,Moq,我正在单元测试一个演示应用程序,它是一个POP3客户端。POP3客户端实现了IDisposable,因此我尝试使用循环测试 (我正在使用nunit 2.5.2和Moq 4.0) 但是dispose没有被调用,这似乎是C#规范。您似乎在测试注入的mockTcpClient实例是否被释放,即使构造函数抛出异常,在这种情况下也应该可以: mockTcpClient.Setup(x => x.Dispose()); try { var popClient= new PopClient(nu

我正在单元测试一个演示应用程序,它是一个POP3客户端。POP3客户端实现了
IDisposable
,因此我尝试使用
循环测试

(我正在使用nunit 2.5.2和Moq 4.0)


但是dispose没有被调用,这似乎是C#规范。

您似乎在测试注入的mockTcpClient实例是否被释放,即使构造函数抛出异常,在这种情况下也应该可以:

mockTcpClient.Setup(x => x.Dispose());
try
{
    var popClient= new PopClient(null, mockTcpClient.Object);
}
finally
{
    mockTcpClient.VerifyAll();
}

编辑:实际上,try/finally比捕获异常更干净。请注意,由于没有创建实例,因此不需要dispose popClient。

您已经发现dispose实际上是而不是构造函数失败时应该调用的。但在其他情况下,您可能希望在引发预期异常后验证模拟。我只是在测试拆卸时这样做:

mockTcpClient.Setup(x => x.Dispose());

try 
{
    using (var popClient = new PopClient(null, mockTcpClient.Object))
    {

    }
}
finally 
{
    mockTcpClient.VerifyAll();
}
[SetUp]
public void SetUp()
{
   this.mockFactory = new MockFactory(MockBehavior.Loose);
}

[TearDown]
public void TearDown()
{
   this.mockFactory.VerifyAll();
}


[Test]
[ExpectedException(typeof(NoBananasException))]
public void EatThrowsIfNoBananasAvailable
{
   var bananaProvider = this.mockFactory.Create<IBananaProvider>();
   bananaProvider.SetUp(bp => bp.IsBananaAvailable).Returns(false).Verifiable();

   var monkey = new Monkey(bananaProvider.Object);
   monkey.Eat();
}
[设置]
公共作废设置()
{
this.mockFactory=新的mockFactory(MockBehavior.Loose);
}
[撕裂]
公共无效拆卸()
{
这个.mockFactory.VerifyAll();
}
[测试]
[ExpectedException(typeof(NoBananasException))]
可通过IfNobanananas获取公共空间
{
var bananaProvider=this.mockFactory.Create();
SetUp(bp=>bp.IsBananaAvailable)。返回(false)。可验证();
var monkey=newmonkey(bananaProvider.Object);
猴子。吃();
}

这并不能回答您的问题(因为问题已经解决了),但它是相关的,无论如何都值得发布

[ExpectedException]是测试异常的一种非常不恰当的方法。它可能容易出错,因为错误的行可能触发预期类型的异常,从而导致错误的传递。我强烈建议您检查Assert.Throws()而不是:)

使用起来更好(您可以查询返回的异常),可读性更高,最重要的是更安全


如果PopClient的构造函数失败,则不会调用它的dispose。但在这种情况下,在让异常传播出去之前,由构造函数来处理它所拥有的资源。
mockTcpClient.Setup(x => x.Dispose());

try 
{
    using (var popClient = new PopClient(null, mockTcpClient.Object))
    {

    }
}
finally 
{
    mockTcpClient.VerifyAll();
}
[SetUp]
public void SetUp()
{
   this.mockFactory = new MockFactory(MockBehavior.Loose);
}

[TearDown]
public void TearDown()
{
   this.mockFactory.VerifyAll();
}


[Test]
[ExpectedException(typeof(NoBananasException))]
public void EatThrowsIfNoBananasAvailable
{
   var bananaProvider = this.mockFactory.Create<IBananaProvider>();
   bananaProvider.SetUp(bp => bp.IsBananaAvailable).Returns(false).Verifiable();

   var monkey = new Monkey(bananaProvider.Object);
   monkey.Eat();
}