0

Microsoft.Fakesを使用して、以下に示すコードの単体テストを作成しようとしています。

Microsoft.Fakes の新機能として、抽象基本クラスの保護された関数メソッドの呼び出しをモックする際に困難に直面しています

私の基本クラス:

public abstract class MyAbstractBaseClass
{
protected virtual int MyFunctionalBaseClassMethod(int parameter1)
{
return (parameter1 * parameter1);
}
}  

私の子クラス:

public class MyChildClass : MyAbstractBaseClass
{
public int GetSquare(int parameter1) //(target method for unit test)
{
return MyFunctionalBaseClassMethod(parameter1); //(target method to mock using Fakes)
}
} 

モックのために次の単体テストコードを試しましたが、うまくいきませんでした:

var square = 10;
var stubMyAbstractBaseClass = new Fakes.StubMyAbstractBase()
{
MyFunctionalBaseClassMethod = (a) => { return square; }
};  

注:私の抽象基本クラスの保護されたメソッドは複雑な操作を実行するため、モックする必要があります。上記のコードは単なるサンプルです。

任意のポインタをいただければ幸いです!

4

1 に答える 1

3

MyChildClass抽象クラスの代わりにスタブアウトする必要があります。これは私にとってはうまくいきました。

[TestMethod]
public void CheckAbstractClassStub()
{
    var myChild = new StubMyChildClass()
    {
        MyFunctionalBaseClassMethodInt32 = (num) => { return 49; }
    };

    int result = myChild.GetSquare(5);
    Assert.AreEqual(result, 49);
}

編集: はい、保護されています。上で述べたように、派生クラスで保護されたメソッドをスタブ化する必要がありますMyChildClass。抽象クラスをスタブ化しました。そこにはインスタンスがなく、呼び出されません。すべてのインスタンスに対して実行したい場合は、Shim を使用できるかもしれませんが、その時点でそれをより難しくしているだけです。

比較できるように、これが私の基本クラスとサブクラスです。

public abstract class MyAbstractBaseClass
{
    protected virtual int MyFunctionalBaseClassMethod(int parameter1)
    {
        return (parameter1 * parameter1);
    }
}

public class MyChildClass : MyAbstractBaseClass
{
    public int GetSquare(int parameter1) //(target method for unit test)
    {
        return MyFunctionalBaseClassMethod(parameter1); //(target method to mock using Fakes)
    }
}

デバッグ ポイントで停止したコードのスクリーン ショットを次に示します。

スタブ値を返す保護されたメソッド

于 2016-12-21T06:29:46.763 に答える