2011-10-18 14 views
5

最近FakeItEasyを使用しようとしていましたが、コンクリートクラスからフェイクを作成することはできませんでした。FakeItEasyクラスの偽物を作成する

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

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

コンストラクタ

次Arguements例外が一致するが見つかりませんでしたをもたらした私が試した:

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を使用してもうまくいかなかったのですか?

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

答えて

0

問題を再現できません。同等のコードを実行すると、問題は再現できません。問題を再現するVSソリューションを作成できますか?submit an issue on GitHub

1

これは古い質問であると認識しています。この問題を抱え、この質問に遭遇した他の誰でもこの回答を投稿しています。私はこれに似た問題を再現することができました。

私はクラスを持っている:

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)))); 

私は同じエラーを受信したコンストラクタで見つかりません。一致する引数例外

最終的に私はデバッガでA.Fakeを呼び出し、(A.Fakeが呼び出した)コンストラクタ内のコードがブロックを初期化できませんでしたVisual Studioが管理者モードで実行されていないためにグローバルメモリが不足しています。 (CreateFileMapping、エラーコード5、System Error 0x5: CreateFileMapping()

私はVisual Studioを管理者として実行するように設定しましたが、問題は解決され、偽のファイルが作成されました。

パラメータを持つコンストラクタを使用して作成されたFakeは、コンストラクタを介して実行されるようです(これは、グローバルメモリがユニットテストの焦点の一部ではないため、偽を作成することによって避けたいと思っています。私はこれを作るべき別の方法があるかどうか調べなければなりません)。

投稿したコードは、ラッパークラスの呼び出しやグローバルメモリの作成を示しているわけではありませんが、デバッガを使用してFake作成呼び出しを実行して、コンストラクタが実行を開始するかどうか、コンストラクタ、および返されるエラー

関連する問題