[英]Mock object that sets an item from session in its constructor
我有第三方类型BillingAddress
,在反编译时,我注意到它在构造函数(来自会话)中设置了一些属性。 我想模拟这种类型并将其发送到实用程序函数:
// need to be able to unit test this method
public static ShippingAddress Convert(BillingAddress billingAddress){
var sAddress = new ShippingAddress();
sAddress.City = billingAddress.City;
// setting several shipping address properties
//...
}
我无法创建BillingAddress的新实例,因为它的Session构造函数代码(当我执行新的BillingAddress()时它会抛出异常 - 因为它只在特定的上下文中工作)
第三方库的解除代码:
public BillingAddress(); // calls base() => gets session stuff
protected BillingAddress(SerializationInfo info, StreamingContext context);
所以,我正在尝试模拟BillingAddress。 这可能吗? 怎么样?
我试过这个:
...
Mock<BillingAddress> m = new Mock<BillingAddress>();
var sAddress = Converter.Convert(c, m.Object);
我明白了:
mscorlib.dll中出现“System.Reflection.TargetInvocationException”类型的异常,但未在用户代码中处理
还试过这个:
var ac = new Mock<BillingAddress>(MockBehavior.Loose, new object[] { new Mock<SerializationInfo>(), new StreamingContext()});
同样的错误
更新:
BillingAddress的构造函数:
// Decompiled code
public BillingAddress()
: base(OrderContext.Current.MetaClass)
{
有没有办法模拟BillingAddress()=>,这样当它调用基数时,它会注入一个模拟的OrderContext? 这样的事情可能吗?
OrderContext是一个具有静态实例(当前)属性的公共类。
我有第三方类型BillingAddress,在反编译时,我注意到它在构造函数(来自会话)中设置了一些属性。 我想模仿这种类型并将其发送到实用程序功能。
如果您没有权利或者只是无法更改BillingAddress
的代码,因为它是一个第三方API,那么只需通过创建一个包装它的新类来隐藏它。
public class BillingAddressWrapper
{
private BillingAddress _billingAddress;
public string City
{
get { return _billingAddress.City; }
}
// Creatae properties that wrap BillingAddress properties as much as you want.
}
使用新类,您将拥有执行所需操作的所有功能,并且为测试目的进行模拟只是其中之一。
在编写应用程序代码时,始终避免与第三方API绑定。 为什么? 因为它们中的大部分都为您提供了要在应用程序中使用的特定实现。 想象一下,如果你必须选择另一个第三方API来替换实际的API,因为它已经过时或者没有对API的支持,你将失去很多时间来转移到新的API。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.