类的一部分将对象初始化为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;
}


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

最佳答案

将代码与第三方实现关注点紧密耦合,使得很难单独对代码进行单元测试。

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

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

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
}


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

关于c# - xUnit用伪造的一个替换ThirdParty类实例,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53408772/

10-13 06:47