4

Visual Studio 2010 で簡単なテスト プロジェクトをセットアップしました。単体テストには nunit 2.6.1 を使用し、FakeItEasy 1.7.4582.63 のモックには NuGet 経由でインストールします。

次のコードを使用して 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 自体からではなく、FakeItEasyが偽の型を作成するために使用するライブラリである Castle.DynamicProxy から発生します。これをさらに調査すると、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 に複製しないように指示するだけですPermissionSetAttribute

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

2 つの注意事項:

  1. プロジェクトでCastle.Core.dllを参照する必要があります (ここから入手できます) 。
  2. FakeItEasy は、この DbDataAdapter の仮想メソッドのみをモックできることに注意してください (繰り返しますが、これは Castle.DynamicProxy/CLR の制限です -ブログ投稿でこれが当てはまる理由を簡単に説明しました) 。
于 2012-08-11T11:31:46.160 に答える