[英]Unit testing static utility class
如何在静态类中单元测试静态方法?
有这个代码:
public class AddressConverter {
public static BillingAddress ConvertAddress(ShippingAddress address)
{
var billingAddress = new BillingAddress (); // this is the problem - 3rd party lib
...
}
我正在使用第三方库,我唯一可以修改的是AddressConverter类。 顺便说一句,BillingAddress()是第三方库,反编译时显示:
// decompiled code
public class BillingAddress : IOrderAddress
{
public BillingAddress() : base(SomeSessionContext.Current.Class)
{
...
问题是我无法创建new BillingAddress()
因为它的值取自某些会话变量等。
我该怎么测试呢? 任何解决方法?
如果您无法重构以将BillingAddress注入静态方法,则可以使用Microsoft Fakes来测试它。
基本上你会为你的第三方DLL添加一个Fakes库:
在“ 解决方案资源管理器”中 ,打开单元测试项目的引用,并选择包含要伪造方法的程序集的引用。 ...选择Add Fakes Assembly 。
然后你应该能够使用ShimBillingAddress
。 (航空代码警告,我无法访问您的第三方lib :-))
using (ShimsContext.Create())
{
// Arrange:
YourThirdPartyLib.Fakes.ShimBillingAddress.SomeMethod = () => { return "some meaningful value"; };
// Instantiate the component under test:
var sut = new AddressConverter();
// Act:
var result = sut.ConvertAddress(someShippingAddress);
// Assert:
}
从MSDN获取的引用和说明- 使用Microsoft Fakes隔离正在测试的代码//使用填充程序和MSDN 入门 - 使用填充程序将应用程序与其他程序集隔离以进行单元测试 。
MSDN上有关于fakes生成的填充程序命名约定的信息,因为它并不总是很明显。
此外, 本答案的后半部分还介绍了如何设置系统dll的假货。
不要在AddressConverter中创建BillingAddress。 为ConvertAddress使用额外的参数或删除static关键字并使用BillingAddressFactory创建IOrderAddress的新实例。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.