private TestImplementation PrepareClient(string responseData, bool withOptions = true, LogVerbosity verbosity = LogVerbosity.Warning, TextWriter tw = null)
        {
            var expectedBytes  = Encoding.UTF8.GetBytes(responseData);
            var responseStream = new MemoryStream();

            responseStream.Write(expectedBytes, 0, expectedBytes.Length);
            responseStream.Seek(0, SeekOrigin.Begin);

            var response = new Mock <IResponse>();

            response.Setup(c => c.GetResponseStream()).Returns(responseStream);

            var request = new Mock <IRequest>();

            request.Setup(c => c.Headers).Returns(new WebHeaderCollection());
            request.Setup(c => c.Uri).Returns(new Uri("http://www.test.com"));
            request.Setup(c => c.GetResponse()).Returns(Task.FromResult(response.Object));

            var factory = new Mock <IRequestFactory>();

            factory.Setup(c => c.Create(It.IsAny <string>()))
            .Returns(request.Object);
            TestImplementation client;

            if (withOptions)
            {
                client = new TestImplementation(new ExchangeOptions()
                {
                    ApiCredentials = new ApiCredentials("Test", "Test2"),
                    LogVerbosity   = verbosity,
                    LogWriter      = tw
                });
            }
            else
            {
                client = new TestImplementation();
            }
            client.RequestFactory = factory.Object;
            return(client);
        }
        private TestImplementation PrepareExceptionClient(string responseData, string exceptionMessage, int statusCode, bool credentials = true)
        {
            var expectedBytes  = Encoding.UTF8.GetBytes(responseData);
            var responseStream = new MemoryStream();

            responseStream.Write(expectedBytes, 0, expectedBytes.Length);
            responseStream.Seek(0, SeekOrigin.Begin);

            var we = new WebException();
            var r  = new HttpWebResponse();
            var re = new HttpResponseMessage();

            typeof(HttpResponseMessage).GetField("_statusCode", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance).SetValue(re, (HttpStatusCode)statusCode);
            typeof(HttpWebResponse).GetField("_httpResponseMessage", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance).SetValue(r, re);
            typeof(WebException).GetField("_message", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance).SetValue(we, exceptionMessage);
            typeof(WebException).GetField("_response", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance).SetValue(we, r);

            var response = new Mock <IResponse>();

            response.Setup(c => c.GetResponseStream()).Throws(we);

            var request = new Mock <IRequest>();

            request.Setup(c => c.Headers).Returns(new WebHeaderCollection());
            request.Setup(c => c.GetResponse()).Returns(Task.FromResult(response.Object));

            var factory = new Mock <IRequestFactory>();

            factory.Setup(c => c.Create(It.IsAny <string>()))
            .Returns(request.Object);

            TestImplementation client = credentials ? new TestImplementation(new ExchangeOptions()
            {
                ApiCredentials = new ApiCredentials("Test", "Test2")
            }) : new TestImplementation();

            client.RequestFactory = factory.Object;
            return(client);
        }