System.IDisposable.Dispose对象'新RSACryptoServiceProvider()'在对它的所有引用超出范围之前

时间:2018-04-07 16:04:05

标签: c# moq

我目前正在使用moq框架为我的C#应用​​程序编写一些单元测试。在我的一个测试中,我有以下代码:

private ICryptoProvider GetMockCryptoProvider(bool rsaKey = true)
{
    var result = Mock.Of<ICryptoProvider>();

    Mock.Get(result)
        .Setup(mock => mock.GetRsaKey(rsaKey))
        .Returns(new RSACryptoServiceProvider());

    return result;
}

当我尝试构建时,我收到以下错误:

  

在方法'LoginServiceUnitTests.GetMockCryptoProvider(bool)'中,调用   System.IDisposable.Dispose对象'new RSACryptoServiceProvider()'在对它的所有引用超出范围之前。

任何熟悉moq的人都知道可能导致此问题的原因吗?

1 个答案:

答案 0 :(得分:0)

在构建服务器上,您可能启用了MS代码分析,并将警告视为错误。您提供的消息实际上是CA2000&#34;在丢失范围之前处置对象&#34;代码分析规则,在GetMockCryptoProvider

中违反

它被违反了,因为你没有处置RSACryptoServiceProvider。在这种情况下,您可能不需要,假设ICryptoProvider本身实现IDisposable并且只是包裹RSACryptoServiceProvider。在这种情况下,您可以暂停此警告,因为如上面的链接所述,&#34;何时压制此警告&#34;:

  

或者引发警告的方法返回IDisposable对象   包裹你的物体。

要压制它,请装饰你的方法:

[SuppressMessage("Microsoft.Reliability", "CA2000:DisposeObjectsBeforeLosingScope")]
private ICryptoProvider GetMockCryptoProvider(bool rsaKey = true)