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



我正在使用nj4x,它有一个具有只读字段的类,如下所示。

   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(主要是填充程序)。我想覆盖这些字段,以便在我的方法中调用它们时,我会获得可预测的测试结果。我为这个类生成了填充程序,但它为我提供的只是一个构造函数,现在允许我仍然初始化它。有没有办法从这个类之外设置这些字段?

它并不漂亮,但是如果您有权访问需要修改的实例,则可以使用 PrivateObject 类的 SetField 方法。PrivateObject类是 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' 之后

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

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

最新更新