2

我有一个使用本地私有方法从数据库获取数据的公共方法。

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

我想使用 moles 转移/隔离私有方法 GetDBData(string),这样我的测试就不需要数据库。

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

编辑
附加信息:

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

4

2 回答 2

2

您可以尝试以下任何方法。

  • 将方法设为内部并向程序集添加这样的属性:

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

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

  • 重构您的类,使其获得一个接口 (IDataAccessObject) 作为构造函数参数, SomeMethod 是该接口的方法之一,然后将该接口的存根传递给您的测试方法中的类。
于 2011-07-24T21:56:22.160 回答
1

我想到了

如果我有私有 SomeMethod 的公共 MyClass

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

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

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