如何调用包含对伪造方法的调用的原始方法?

Jas*_*ans 4 .net microsoft-fakes

我正在使用MS Fakes。

进行以下课程:

public class Person
{
    public void SaveQuotes()
    {
        DoSomething();
    }

    private void DoSomething()
    {
        Console.WriteLine("Original DoSomething called.");
    }
}
Run Code Online (Sandbox Code Playgroud)

和这个测试:

[TestMethod]
public void TestMethod1()
{
    using (ShimsContext.Create())
    {
        var sut = new ShimPerson();

        sut.DoSomething = () => { Console.WriteLine("Called from test"); };

        sut.Instance.SaveQuotes();
    }
}
Run Code Online (Sandbox Code Playgroud)

当我运行测试时,该sut.Instance.SaveQuotes()方法基本上被跳过了,因为该方法已被填充。我想要的是执行原始SaveQuotes()方法。所以我尝试了这个:

[TestMethod]
public void TestMethod1()
{
    using (ShimsContext.Create())
    {
        var sut = new ShimPerson();

        sut.DoSomething = () => { Console.WriteLine("Called from test"); };
        sut.SaveQuotes = () => { ShimsContext.ExecuteWithoutShims(() => sut.Instance.SaveQuotes()); };

        sut.Instance.SaveQuotes();
    }
}
Run Code Online (Sandbox Code Playgroud)

现在运行测试时,它确实执行了原始方法SaveQuotes(),但副作用是,它也运行了原始DoSomething()方法。

我如何运行原始SaveQuotes()但伪造的文件DoSomething()。TypeMock会.CallOriginal在设置伪造品时执行此操作,但我无法在MS Fakes中看到如何做。

Jas*_*ans 5

好,我知道了。

我必须ShimBehaviors.InstanceBeahviour像这样更改属性:

[TestMethod]
public void TestMethod1()
{
    using (ShimsContext.Create())
    {
        var sutShim = new ShimPerson();

        sutShim.DoSomething = () => { Console.WriteLine("Called from test"); };

        sutShim.InstanceBehavior = ShimBehaviors.Fallthrough;

        sutShim.Instance.SaveQuotes();
    }
}
Run Code Online (Sandbox Code Playgroud)

这告诉Fakes SaveQuotes()在仍然使用伪造的DoSomething()方法的同时调用原始方法。我发现这是一个很好的参考:

http://www.codewrecks.com/blog/index.php/2012/05/10/shim-and-instancebehavior-fallthrough-to-isolate-part-of-the-sut/