如何使用Microsoft Fakes框架来填充实例方法?

时间:2013-12-12 09:27:55

标签: unit-testing mocking microsoft-fakes

我在VS2012中使用Microsoft Fakes框架。

我使用以下代码来填充我类型的实例方法。

    using (ShimsContext.Create())
    {
        ShimDateTime.NowGet = () => { return new DateTime(1949, 10, 1); };
        DateTime now = DateTime.Now;  // shim works for the static property DateTime.Now.

        Class1 dependency = new Class1();


        using (ShimsContext.Create())
        {
            ShimClass1 shim1 = new ShimClass1();
            StubClass1 stub1 = new StubClass1();
            shim1.method1 = () => { return "shim method1"; };
            shim1.IMethod1 = () => { return "shim IMethod1"; };

            String s1 = dependency.method1();// shim doesn't work for the instance method.
            String s2 = dependency.IMethod1();// shim doesn't work for the instance method.
        }

class1,如下所示:

public class Class1 : Interface1
{
    public String method1()
    {
        return "real method1";
    }

    //Interface 1 member
    public string IMethod1()
    {
        return "real IMethod1";
    }
}

我希望s1和s2是shimed输出,但它仍然是实际输出。

为什么?

1 个答案:

答案 0 :(得分:5)

如果'method1'是静态的,你的垫片就可以了。然而,使用当前代码,您还没有真正填满'method1'。您需要将实例与填充实例关联

  

Class1依赖=新的ShimClass1(){Method1 =()=> {return“Shim.Method1”; }};

或将所有实例方法与您的代理相关联

  

ShimClass1.AllInstances.Method1 =(q)=> {return“Shim.Method1”; };

此外,我没有看到需要两次完成ShimsContext.Create()

如果你想使用存根来重定向IMethod1,你应该使用StubInterface1而不是

  

Class1 dependency = new StubInterface1(){Method1 =(){return“”; }};

这些变化可在msdn上获取以供参考