繁体   English   中英

如何模拟/覆盖只读字段以进行单元测试

[英]How to mock/ override readonly fields for unit testing

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

它是不是很漂亮,但如果你有机会到需要进行修改的情况下,你可以使用SetField的方法PrivateObject 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; }
    }
    ...
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM