繁体   English   中英

模拟对象,在其构造函数中设置会话中的项目

[英]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.

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