4

我在 Visual Studio 2010 中设置了一个简单的测试项目。对于单元测试,我使用 nunit 2.6.1 并模拟我通过 NuGet 安装的 FakeItEasy 1.7.4582.63。

我尝试使用以下代码伪造 DbDataAdapter:

using System.Data.Common;
using FakeItEasy;
using NUnit.Framework;

namespace huhu
{
    [TestFixture]
    public class Class1
    {
        [Test]
        public void test1()
        {
            A.Fake<DbDataAdapter>();
        }
    }
}

当我使用 .NET framework 3.5 运行测试时,一切正常并且 test1 将通过。但是,当我将框架版本设置为 .NET 4.0 时,出现以下异常:

FakeItEasy.Core.FakeCreationException : 
  Failed to create fake of type "System.Data.Common.DbDataAdapter".

  Below is a list of reasons for failure per attempted constructor:
    No constructor arguments failed:
      No default constructor was found on the type System.Data.Common.DbDataAdapter.
    The following constructors were not tried:
      (*System.Data.Common.DbDataAdapter)

      Types marked with * could not be resolved, register them in the current
      IFakeObjectContainer to enable these constructors.

任何如何使事情在 .NET 4.0 中工作的想法都值得赞赏!

再见,约尔格

4

1 回答 1

4

通常这些问题不是来自 FakeItEasy 本身,而是来自Castle.DynamicProxy,FakeItEasy 用来创建假类型的库。进一步调查这一点会导致 Castle 抛出以下异常:

由于 CLR 中的限制,DynamicProxy 无法成功复制 System.Data.Common.DbDataAdapter.CloneInternals 上的不可继承属性 System.Security.Permissions.PermissionSetAttribute。为避免此错误,您可以通过调用“Castle.DynamicProxy.Generators.AttributesToAvoidReplicating.Add(typeof(System.Security.Permissions.PermissionSetAttribute))”来选择不复制此属性类型。

检查DbDataAdapter基类的源代码 ( DataAdapter) 表明情况确实如此:

[PermissionSet(SecurityAction.Demand, Name = "FullTrust")]
protected virtual DataAdapter CloneInternals()

Castle 已经暗示了如何解决这个问题。在创建假货之前,只需指示 Castle 不要复制PermissionSetAttribute

Castle.DynamicProxy.Generators
   .AttributesToAvoidReplicating.Add(typeof(PermissionSetAttribute));
var fake = A.Fake<DbDataAdapter>();

有两点需要注意:

  1. 您需要在项目中引用Castle.Core.dll(可在此处获得)
  2. Keep in mind FakeItEasy will only be able to mock virtual methods of this DbDataAdapter (again, this is Castle.DynamicProxy/CLR limitation - I briefly explained why this is the case in my blog post)
于 2012-08-11T11:31:46.160 回答