我可以设置私有只读实例变量吗?

时间:2014-07-18 14:25:13

标签: c# unit-testing reflection

我想知道是否可以通过反射或某种方式设置private readonly类变量?

考虑以下课程:

public class TestSevice
{
    private readonly someClassType m_variable;

    public TestService()
    {
        m_variable = //call to some processing function
    }

    private static int CalculateStuff(int x, int y)
    {
        //some processing and return
    }
}

我正在为private static方法CalculateStuff(int x, int y)编写一个单元测试,我可以通过反思调用它:

PrivateType pt = new PrivateType(typeof(AvatarService));
int actialRes = (int)pt.InvokeStatic("CalculateStuff", parameters);

问题是,为了让我的单元测试起作用,我不想在调用m_variable函数时设置null或将其设置为static

那么,构造函数是否可以在无单元测试的情况下将m_variable或自定义设置为单元测试中的某些内容?

修改 关于//call to some processing function的一些细节 在这里,调用以启动消息队列的接收者。

TestService在worker角色的开头实例化,因此队列接收器在ctor中启动。然后,消息队列接收器调用TestSevice类中的包装函数,该函数又调用CalculateStuff。由于我只是想测试核心业务逻辑,我不想启动队列接收器(这会产生某些依赖关系)。

2 个答案:

答案 0 :(得分:1)

如果您试图通过修改其行为来测试一个类,那么您已经错过了这一点。

如果有一种方法可以让某个班级进入某个考试,那么你应该如何测试它。只读它唯一的方法是通过构造函数。

如果该属性是只读的,则建议您只想为该类的特定实例实例化一次并知道它不能更改。如果是这种情况,您不应该更改它,但可能实例化另一个实例。

如果需要在每次调用计算之前更改它并且您处于您认为需要该函数为静态的情况,那么您应该将其作为额外参数。这意味着它可以更长时间只读。这样做会将它与给定实例的状态断开,但如果您正在尝试/需要更改该值,则它不应该是只读的。

答案 1 :(得分:0)

显然答案是肯定的。 https://stackoverflow.com/a/934942/2540156但这听起来并不像你的问题。听起来你想要一个替代构造函数在单元测试期间调用,这将阻止代码运行设置你的变量。为此,您必须对构造函数进行更改。