如何在公共阶层鼹鼠中转移“非公开”方法

时间:2011-07-24 12:34:06

标签: unit-testing moles pex

我有一个公共方法,它使用本地私有方法从Db获取数据。

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

我想使用moles转移/隔离私有方法GetDBData(string),因此我的测试不需要DB。

显然,我的问题是:怎么做? 谢谢 乌里亚

EDIT
其他信息:

我试图将方法访问器更改为公共和内部受保护, 在这两种情况下,我现在可以将方法视为痣。 但是在运行测试时,原始方法仍在使用,而不是我在PexMethod中实现的绕道。

2 个答案:

答案 0 :(得分:2)

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

  • 制作方法 internal 并将类似属性添加到程序集中:

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

  • 将方法访问权限更改为 protected virtual ,然后使用存根。

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

答案 1 :(得分:1)

我想通了

如果我有公开的MyClass与私人SomeMethod

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

如果你想破坏SomeMethod方法,你需要在测试方法中使用AllInstances:

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