我在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输出,但它仍然是实际输出。
为什么?
答案 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上获取以供参考