xUnit用伪造的一个替换ThirdParty类实例

时间:2018-11-21 09:21:10

标签: c# unit-testing xunit.net

类的一部分将一个对象初始化为MLM(需要大量的设置和安装),我需要替换它 用假物体以简单的方式做同样的事情,

例如,如何使用假对象测试以下代码

// LMXProxyServerClass is the library in which need a lot of installation 
private readonly LMXProxyServerClass lmxProxyServer; 

这是我使用的一种方法的示例

private bool CreateBindingWithoutPropagate(string attributeName, bool supervisory)
{
    bool creatingBindingResult = false;

    lock (mxAccessProxyLock)
    {

        if (!bindings.ContainsKey(attributeName))
        {
            try
            {
                logger.Debug("Adding item " + attributeName + " to bindings, not in list so add.");

                // Add the handle to the mapping
                lmxHandleToAttributeNameMapping.Add(attributeBinding.MxAttributeHandle, attributeName);

                if (supervisory)
                {
                     lmxProxyServer.DoSOmethingElse(yyyyyyyyyyyyyyyyyyyyyyy);
                    logger.Info(xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx);
                }
                else
                {

                    lmxProxyServer.DoSOmething(xxxxxxxx);
                    logger.Info(xxxxxxxxxxx);
                }

                // Add the binding to the list of bindings.
                bindings.Add(attributeName, attributeBinding);

                logger.Info("Creating binding for: " + attributeName);

                creatingBindingResult = true;

            }
            catch (System.UnauthorizedAccessException unauthorizedAccessException)
            {

                logger.Error("xxxxxxxxxxx", attributeName);
                throw ConvertExceptionToFault(unauthorizedAccessException);

            }
            catch (Exception ex)
            {
                throw ConvertExceptionToFault(ex);
            }
        }
    }

    return creatingBindingResult;
}

此库是第三方库,因此我无法控制它,因此在测试中,我需要用伪造的库替换此对象,因此我不会在基础代码中做很多更改,也不会简化其他部分的测试< / p>

1 个答案:

答案 0 :(得分:2)

将代码紧密结合到第三者的实现方面,很难对代码进行单独的单元测试。

相反,将第三方的实现问题封装在一个抽象中,可以在测试时根据需要进行模拟。

例如,创建第三方依赖项的抽象,仅公开代码所需的内容。

public interface ILMXProxyServer {
    void DoSOmethingElse(...);
    void DoSOmething(...);
    //...
}

并通过构造函数注入将其显式注入到依赖项中。

public class MyClass {
    private readonly ILMXProxyServer lmxProxyServer; 

    public MyClass(ILMXProxyServer lmxProxyServer) {
        this.lmxProxyServer = lmxProxyServer;
    }

    //...other code omitted for brevity
}

方法保持不变,因为它们将调用抽象的公开成员。

运行时实现将包装/封装第三方依赖项

public class MyLMXProxyServerWrapper : ILMXProxyServer {
    // LMXProxyServerClass is the library in which need a lot of installation 
    private readonly LMXProxyServerClass lmxProxyServer; 


    public void DoSOmething(Something xxxxxxx){
         lmxProxyServer.DoSOmething(xxxxxxxx);
    }

    //...code omitted for brevity
}

通过这种重构,代码现在更加灵活,可以在使用您选择的模拟框架进行独立测试或通过滚动自己的测试专用实现时,模拟/伪造代理服务器。