繁体   English   中英

单元测试静态实用程序类

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

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