如何使用Microsoft Fakes覆盖存根中的方法和调用base

时间:2014-05-12 15:12:05

标签: c# microsoft-fakes

我想用MS Fakes覆盖会调用基本代码但我无法找到如何做到这一点。这是一个例子

给出

public class Potato
{
   public virtual string Peel(PeelingMethod peelingMethod)
   {
      return "potato peeled";
   }
}

当我创建Stub

new StubPotato()
{
    PeelPeelingMethod = (p) =>
    {
       //Doesn't compile!
       base.Peel(p);
       Console.WriteLine("Hello world");
    }
}

我怎样才能实现这一点,我对MS Fakes框架很陌生,所以也许我不了解它。

1 个答案:

答案 0 :(得分:0)

我找到了一个解决方案,它非常恶心,但它确实有效。如果有人需要,我会把它放在这里。我将重用我的例子(我编辑,因为我没有使用返回void的方法测试这个答案)

var stubPotato = new StubPotato()
{
    PeelPeelingMethod = (p) =>
    {
        //Base method call
        MethodInfo methodInfo = typeof(Potato).GetMethod("Peel", BindingFlags.Instance | BindingFlags.Public);
        var methodPtr = methodInfo.MethodHandle.GetFunctionPointer();
        var baseMethod = (Func<PeelingMethod,string>)Activator.CreateInstance(typeof(Func<PeelingMethod,string>), stubPotato , methodPtr);
        string baseResult = baseMethod(p);

        //Code for the "override"
        Console.WriteLine("Hello world");
    }
}