簡體   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