如何模拟/覆盖单元测试的只读字段

时间:2016-12-30 13:37:40

标签: c# unit-testing readonly microsoft-fakes nsubstitute

我使用的是nj4x,它有一个具有readonly字段的类,如下所示。

   public class MarketInformation
    {
    public readonly double ASK;
    public readonly double BID;
    public readonly double DIGITS;
    public readonly double EXPIRATION;
    public readonly double FREEZELEVEL;
    }

我正在为编写这些类的类和方法编写单元测试。对于隔离/模拟,我使用的是Nsubstitute和MicrosoftFakes(主要是垫片)。我想覆盖这些字段,所以当我在我的方法中调用它时,我得到了可预测的测试结果。 我为这个类生成了shim,但它提供给我的只是一个构造函数,现在允许我对它进行初始化。有没有办法从这个类外面设置这些字段?

2 个答案:

答案 0 :(得分:2)

它不是很漂亮,但如果您有权访问需要修改的实例,则可以使用the SetField method of the PrivateObject classPrivateObject类是MS单元测试框架的一部分。

例如,考虑类:

public class ClassWithReadOnly
{
    public readonly string Foo;

    public ClassWithReadOnly()
    {
        Foo = "bar";
    }
}

您可以像这样设置只读字段:

var test = new ClassWithReadOnly();
Console.WriteLine("Before Foo == '{0}'", test.Foo);
var po = new PrivateObject(test);
po.SetField("Foo", "oof");
Console.WriteLine("After Foo == '{0}'", test.Foo);

输出将是:

  

在Foo之前​​==' bar'

     

在Foo ==' oof'

之后

答案 1 :(得分:1)

您可能需要使用自己的get属性创建一个包装类来存根或填充它。如果要使用存根(未显示),可以创建自己的界面。

public class MarketInformationWrapper : MarketInformation
{
    ...
    public double Ask
    {
        get { return ASK; }
    }
    ...
}