xUnit для замены экземпляра класса ThirdParty на поддельный - PullRequest
0 голосов
/ 21 ноября 2018

Часть моего класса инициализирует объект в 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;
}

Эта библиотека стороннего производителя, поэтомуЯ не контролирую его, поэтому в тестировании мне нужно заменить этот объект на фальшивый, чтобы я не сильно изменил базовый код и не упростил тестирование других частей

1 Ответ

0 голосов
/ 21 ноября 2018

Тесная связь кода с задачами сторонней реализации затрудняет модульное тестирование кода в отдельности.

Вместо этого инкапсулируйте стороннюю реализацию реализации в абстракцию, которая при необходимости может быть смоделирована при тестировании.

Например, создайте абстракцию сторонней зависимости, выставляя только то, что нужно вашему коду.

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
}

С этим рефактором кодтеперь стало более гибким, чтобы иметь возможность имитировать / подделывать прокси-сервер при тестировании в отдельности с использованием выбранной вами моделируемой среды или путем развертывания собственных реализаций, специфичных для тестирования.

...