c#中的拦截方法/属性调用

时间:2015-02-26 15:54:40

标签: c# unit-testing reflection

在下面的代码中,我有一个类Foo,我的main方法调用它(没有接口)。该属性没有后备字段或setter,而是调用私有方法。 Foo不能改变,也不能将foo的用法改为IFoo接口。

- 如何更改foo.FooValue的值?

- 我可以在单元测试中包含System.Reflection,System.Reflection.Emit,.NET标准库等(不安全的代码,等等)以改变返回值吗?

我很感激,如果有什么东西它必定是相当的“邪恶的”#34;但我感兴趣的是"邪恶"答案。

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 - 也许答案是"不是#34;但我不相信最高的答案只是指出你可以通过改变a来实现这一点(不存在的支持领域。

Intercept call to property get method in C# - 有趣。不确定这是否是我的答案,如果是,不确定如何在单元测试中使用它。

编辑:好的。我将重新编写代码以使其更易于测试。然而,出于兴趣,有没有人成功地通过这种情况破解了他们的方式?

1 个答案:

答案 0 :(得分:3)

您可以为Foo创建可以模拟的代理:

public class FooProxy : IFoo
{
    private Foo _Foo;
    public FooProxy(Foo foo)
    {
        _Foo = foo;
    }
    public int FooValue
    {
        get {return _Foo.FooValue();
    }
}

public interface IFoo
{
    public int FooValue {get;}
}

然后您可以使用DI“注入”IFoo并使您的代码更易于测试。