5

クラスのコンストラクターを Microsoft Fakes で分離/置換する可能性はありますか?

Mole (Fakes の前身) の例が見つかりました: http://thecurlybrace.blogspot.co.at/2011/11/how-do-i-detour-mole-type-constructor.html

私はこのような構造を試しました

ShimStreamReader.Constructor = @this => ShimStreamReader.ConstructorString(@this, "Test");

しかし、getアクセサーが欠落していると書かれています。明確にするために、次のようなものを置き換えるとよいでしょう

new StreamReader("filename")

このような静的入力で

new StreamReader(new MemoryStream(Encoding.Default.GetBytes("33\r\n1\r\n16\r\n5\r\n7")))

Read、ReadLineなどをモックする必要がないように.

4

2 に答える 2

6
using (ShimsContext.Create())
{
    ShimStreamReader.ConstructorString = 
        delegate(StreamReader @this, string @string)
        {
            var shim = new ShimStreamReader(@this);
            shim.Read = () => 42;
        };

    var target = new StreamReader("MeaningOfLife.txt");
    Assert.AreEqual(42, target.Read());
}
于 2012-10-13T00:03:28.630 に答える
4

リフレクションを介して別のコンストラクターを置き換えて呼び出すことができます。

「したがって、コンストラクターを置き換えるときは、コンストラクターですべての初期化を行う必要があります。オブジェクトが元のコンストラクターによって内部でどのように初期化されるかがわからず、プライベートにアクセスできないため、StreamReader コンストラクターは不可能な場合があります。オブジェクトのメンバー。

そのため、リフレクションを使用して元のコンストラクターを呼び出してオブジェクトを初期化し、それを使用できます。" - http://social.msdn.microsoft.comの Vikram Agrawals の回答を参照してください。

したがって、私の質問に関するコードは次のようになります。

ShimStreamReader.ConstructorString = (@this, value) =>
{
    ConstructorInfo constructor = typeof (StreamReader).GetConstructor(new[] {typeof (Stream)});
    constructor.Invoke(@this, new object[] {new MemoryStream(Encoding.Default.GetBytes("33\r\n1\r\n16\r\n5\r\n7"))});
};
于 2012-10-26T13:08:33.360 に答える