【发布时间】:2015-04-29 02:16:06
【问题描述】:
在下面的代码中,我有一个类 Foo,它被我的 main 方法调用(没有接口)。该属性没有支持字段或设置器,而是调用私有方法。 Foo不能变,foo的用法也不能改成IFoo接口。
- 如何更改 foo.FooValue 的值?
- System.Reflection、System.Reflection.Emit、.NET 标准库等(不安全代码等)中是否有任何我可以包含在单元测试中以更改返回值的内容?
如果有什么东西肯定是“邪恶”的,我很感激,但我对“邪恶”的答案很感兴趣。
public class Program
{
public static void Main(){
Foo foo = new Foo();
int bar = foo.FooValue;
}
}
public class Foo{
public int FooValue
{
get
{
return this.FooMethod();
}
}
private int FooMethod
{
return 0;
}
}
相关问题:
How to set value of property where there is no setter - Related but unanswered - 也许答案是“不”,但我不相信最佳答案只是指出您无法通过更改(不存在的)支持字段来实现这一点。
Intercept call to property get method in C# - 有趣。不确定这是否是我的答案,如果是,不确定如何在单元测试中使用它。
编辑:好的。我将重新编写我的代码以使其更具可测试性。但是,出于兴趣,有没有人成功破解了这种情况?
【问题讨论】:
-
您拥有
Foo类吗?您将其硬编码为返回 0。添加一个属性或字段,然后让它返回该属性并添加一个 setter。 -
所以你的兴趣只是为了单元测试?你本质上是想通过改变
Foo的行为来“模拟”它吗? -
@mason 我不拥有 Foo 类。我宁愿不重构,如果我要重构,我会通过使用 at 作为 IFoo 将 Foo 与我的代码分离。
-
@Dstanley 基本上,是的。我的三个步骤是:我可以模拟它(否),我可以反映它(否),让我们看看实现。
-
您要测试
FooValue的值还是依赖FooValue的其他值?
标签: c# unit-testing reflection