Подделка данных с использованием Moq и xunit - PullRequest
0 голосов
/ 22 апреля 2020

Я новичок в модульном тестировании и, следуя такому количеству статей, я могу написать ниже модульный тест, но он не работает, так как нет никакой связи между основным классом и классом фабрики. Как решить эту проблему? Можно ли написать модульный тест, не меняя структуру моего класса.

Мой класс:

public class SomeClass : ISomeClass
        {    
            public ServiceClientManager<IScan> scan;

            public SomeClass(Action<String> logMessages)
            {
                this.logMessage = logMessages;
            }

            public void Process(string a, string b, string c)
            {
            if (this.Scan == null)
            {
               ConnectToScan();                   
            }

            if (status)
            {
                Scan.Proxy.MethodScan(a, b, c);
            }
        }
} 



public bool ConnectToScan()
        {
            this.Scan = null;
                NetTcpBinding netTcpBinding = new NetTcpBinding();
                netTcpBinding.MaxBufferSize = int.MaxValue;
                netTcpBinding.MaxReceivedMessageSize = int.MaxValue;
                netTcpBinding.ReaderQuotas.MaxArrayLength = int.MaxValue;
                netTcpBinding.ReaderQuotas.MaxBytesPerRead = int.MaxValue;
                netTcpBinding.ReaderQuotas.MaxDepth = int.MaxValue;
                netTcpBinding.ReaderQuotas.MaxNameTableCharCount = int.MaxValue;
                netTcpBinding.ReaderQuotas.MaxStringContentLength = int.MaxValue;
                netTcpBinding.ReceiveTimeout = TimeSpan.FromMinutes(5);
                netTcpBinding.CloseTimeout = TimeSpan.FromMinutes(5);
                netTcpBinding.OpenTimeout = TimeSpan.FromMinutes(5);
                netTcpBinding.SendTimeout = TimeSpan.FromMinutes(5);
                barcodeScanner = new ServiceClientManager<IScan>(netTcpBinding, new EndpointAddress("net.tcp://localhost/XXXX"));
                return true;
        }

Здесь ConnectToScan () установит sh соединение со службой, и я Я использую его внутри метода Process для передачи параметров этому сервису. Чтобы написать модульный тест для этого метода, я пытаюсь смоделировать службу «IScan» и утверждаю, что метод службы вызывается как минимум один раз.

Мой модульный тест:

  private Action<string> _logMessage = msg => Console.WriteLine(msg);

       [Fact]
    public void MethodTest()
    {
        var factoryScanMoq = new Mock<IScan>();
        factoryScanMoq.Setup(x => x.MethodScan("test", "S000", "test2"))
        .Returns(null);

        var mockService = new ServiceClientManager<IScan>(factoryBarcodeScanMoq.Object);

        classObj.process("test", "S000", "test2"); // FactoryScanMoq is not passed here

        classObj.Scan = mockService;

        factoryScanMoq.Verify(x => x.MethodScan("test", "S000", "test2"), Times.Once);
    }

I Я знаю, что нет никакой связи между фабрикой Mock и SomeClass, но я не уверен, как создать отношение, поскольку я не могу передать FactoryMoq в SomeClass в качестве аргумента конструктора.

Заранее спасибо

...