我使用的是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,但它提供给我的只是一个构造函数,现在允许我对它进行初始化。有没有办法从这个类外面设置这些字段?
答案 0 :(得分:2)
它不是很漂亮,但如果您有权访问需要修改的实例,则可以使用the SetField
method of the PrivateObject
class。 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'
之后
答案 1 :(得分:1)
您可能需要使用自己的get
属性创建一个包装类来存根或填充它。如果要使用存根(未显示),可以创建自己的界面。
public class MarketInformationWrapper : MarketInformation
{
...
public double Ask
{
get { return ASK; }
}
...
}