5

最近 FakeItEasy を使用しようとしましたが、多くの癖を回避せずに具象クラスから Fake を作成できませんでした。

私は次のことを試しました:

public class MyObject {
public MyObject(){}
}
...
MyObject fakeObject = A.Fake<MyObject>();

その結果、引数が一致するコンストラクターが見つかりませんという例外が発生しました

次に試しました:

public class MyObject {
public MyObject(string temp){}
}
...
MyObject fakeObject = A.Fake<MyObject>(x => x.WithArgumentsForConstructor(() => new MyObject("temp")));

その結果、同様のエラーが発生しました。

最後に私が試した:

public class MyObject {
//public MyObject(){}
}
...
MyObject fakeObject = A.Fake<MyObject>();

これにより、最終的に偽物を作成することができました。具象クラスを偽造する例のほとんどが、これが私が見つけたよりも簡単であることをほのめかしている理由について、私は混乱していますか? そして、文書化された方法、上記の試行 #2 を使用してもうまくいかなかったのはなぜですか?

文書化されていない具体的なクラスを偽造することにはいくつかの制限がありますか?

4

2 に答える 2

3

これは古い質問であることを認識しているため、この問題があり、この質問に出くわした他の人のためにこの回答を投稿しています。これと同様の問題を再現できました。

私はクラスを持っています:

public class Service : IService
{
   public Service (int prNum)
   {
   //call to a c++ wrapper class (this is where the problem occurs)
   //some other calls
   }
}

単体テスト用の偽物としてサービスクラスを作成しようとしていました:

private Service fakeServ = A.Fake<Service>((x => x.WithArgumentsForConstructor(() => new Service(3))));

私は同じエラーを受け取っていました: Constructor Not Found with Matching Arguments Exception

最終的に、デバッガーを使用して A.Fake 呼び出しに踏み込んだところ、Visual Studio が管理者モードで実行されていないため、コンストラクター内のコード (A.Fake が呼び出した) がグローバル メモリのブロックの初期化に失敗していることがわかりました。(CreateFileMapping、エラー コード 5、システム エラー 0x5: CreateFileMapping() )

Visual Studio を管理者として実行するように設定したところ、問題は解決し、偽物が作成されました。

パラメーター付きのコンストラクターで作成された Fake は、コンストラクターを介して実行されるようです (これは、グローバル メモリが単体テストの焦点の一部ではないため、偽物を作成することで回避したかったことです。これを作成する別の方法があるかどうかを調べてください)。

投稿したコードは、ラッパー クラスを呼び出している、またはグローバル メモリを作成していることを示していませんが、デバッガーを使用して Fake 作成呼び出しにステップ インして、コンストラクターが実行を開始するかどうか、およびコンストラクターに障害があるかどうかを確認できます。エラーが返されます。

于 2016-05-27T19:52:22.837 に答える
0

同等のコードを実行すると、問題を再現できません。問題を再現するvs-solutionを作成し、GitHubで問題を送信できますか?

于 2011-10-18T13:47:19.700 に答える