2011-07-24 42 views
2

我有一个使用本地私有方法从Db获取数据的公共方法。如何在公共课程中转移“非公开”方法

private string SomeMethod(string) { ... Doing some operations ... string data = GetDBData(string); Doing some operations ... }

我想用痣,所以我的测试将不需要DB疏导/隔离私有方法GetDBData(串)。

显然,我的问题是:如何做到这一点? 谢谢 URIA

编辑
其他信息:

我试图改变方法存取既公开和内部保护, 在这两种情况下,我现在可以看到的方法以摩尔。 但是当运行测试时,原始方法仍在使用中,而不是我在PexMethod中实现的绕行。

回答

1

我想通了

如果我有私人的someMethod

public class MyClass 
{ 
    private string SomeMethod(string str){} 
} 

公共MyClass的,如果你想要去痣,你需要在测试方法中使用AllInstances的的someMethod方法:

[PexMethod] 
SomeMethod(string str) 
{ 
    MMyClass.AllInstances.SomeMethod = (instance, str) => { return "A return string"; }; 
} 
  • 注意到lambda接收到一个实例参数为第一个参数。我不确定它的功能是什么。
+0

实例参数允许您使用委托内的原始调用实例。 –

+0

不要忘记将此标记为您接受的答案! =) –

2

您可以尝试以下任何一种。

  • 使该方法内部像这样添加一个属性集:

    [assembly: InternalsVisibleTo("<corresponding-moles-assembly-name>")]

  • 更改为方法访问受保护的虚拟然后用存根。

  • 重构类,以便它将接口(IDataAccessObject)作为构造函数参数,SomeMethod作为该接口的方法之一,然后将该接口的存根传递给测试方法中的类。