我单元测试一个演示应用程序,这是一个POP3客户。POP3客户实现了 IDisposable, 所以我想测试一个 using 循环。

(我采用关2.5.2和最低采购量4.0)

/// <summary>
/// Unsuccessful construct dispose cycle, no ILogger object given. 
/// Expecting ArgumentNullException. Expecting TcpClient dispose to be called.
/// </summary>
[Test]
[ExpectedException(typeof(ArgumentNullException))]
public void ConstructorDispose_LoggerNull_ArgumentNullException()
{
    mockTcpClient.Setup(x => x.Dispose());
    using (var popClient = new PopClient(null, mockTcpClient.Object))
    {

    }
    mockTcpClient.VerifyAll();
}

正如你可以看到的 verifyAll 方法将永远不得援引和试验将是成功的,尽管如此。所以...

  • 什么是最好的方式来解决这个?
  • 是否有另一种方式再试试抓住?

更新我的固定这样的时刻:

        mockTcpClient.Setup(x => x.Dispose());
        var correctExceptionThrown = false;
        try
        {
            using (var popClient = new PopClient(null, mockTcpClient.Object))
            {

            }
        }
        catch (ArgumentNullException)
        {
            correctExceptionThrown = true;
        }
        finally
        {
            mockTcpClient.VerifyAll();
        }
        Assert.That(correctExceptionThrown);

但处置不叫, 似乎是将C#规范。

有帮助吗?

解决方案

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

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

    }
}
finally 
{
    mockTcpClient.VerifyAll();
}

其他提示

这不会回答你的问题(因为它已经解决),但它的相关性和价值发布。

[ExpectedException]是一个非常举步维艰的方式检验的例外情况。它可以容易出错的,因为错误的线可能触发一个异常的预期类型导致错误的通过。我强烈主张,你检查出断言。抛出()代替:)

这是更好的使用(可查询返回的例外),更具可读性和更加安全。

你可以找到一个例子在这里

你已经发现处理真的是 应该称为如果该构造失败。但仍可能有其他情况下,你可能想要验证你的嘲笑后预计发生异常.我只是在测试拆除这样的:

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

你似乎是测试,注mockTcpClient实例是设置甚至如果该构造中抛出的一个例外,在这种情况下,本应该工作:

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

编辑:实际上,试用/最终将被吸尘器比醒目的例外。注意,你不需要处理popClient由于没有实例创建的。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top