public void Respond_Should_Protect_Against_Throw_And_Throws_Or_Returns(ExceptionOrReturn <string> response)
        {
            var mockSetup = new Mock <ISetup <IToMock, string> >();
            var callOrder = new List <int>();

            mockSetup.Setup(m => m.Throws(null)).Callback(() =>
            {
                callOrder.Add(1);
            });
            if (response.Return != null)
            {
                mockSetup.Setup(m => m.Returns(response.Return)).Callback(() =>
                {
                    callOrder.Add(2);
                });
            }
            else
            {
                mockSetup.Setup(m => m.Throws(response.Exception)).Callback(() =>
                {
                    callOrder.Add(2);
                });
            }

            var responses            = new Mock <IInvocationResponses <ExceptionOrReturn <string> > >().Object;
            var passOrThrowResponder = new ExceptionsOrReturnsInvocationResponder <IToMock, string>(mockSetup.Object, responses, 0);
            var respondMethod        = typeof(ExceptionsOrReturnsInvocationResponder <IToMock, string>).GetMethod("Respond", BindingFlags.Instance | BindingFlags.NonPublic);

            respondMethod.Invoke(passOrThrowResponder, new object[] { response });

            Assert.That(callOrder, Is.EquivalentTo(new int[] { 1, 2 }));
        }
        public void RespondExhausted_Should_Protect_Against_Throw_And_Return_Default_Return()
        {
            var mockSetup = new Mock <ISetup <IToMock, TReturn> >();
            var callOrder = new List <int>();

            mockSetup.Setup(m => m.Throws(null)).Callback(() =>
            {
                callOrder.Add(1);
            });
            mockSetup.Setup(m => m.Returns(expectedDefault)).Callback(() =>
            {
                callOrder.Add(2);
            });


            var responses            = CreateResponses();
            var passOrThrowResponder = new ExceptionsOrReturnsInvocationResponder <IToMock, TReturn>(mockSetup.Object, responses, 0);
            var respondMethod        = typeof(ExceptionsOrReturnsInvocationResponder <IToMock, TReturn>).GetMethod("RespondExhausted", BindingFlags.Instance | BindingFlags.NonPublic);

            respondMethod.Invoke(passOrThrowResponder, new object[] { });

            Assert.That(callOrder, Is.EquivalentTo(new int[] { 1, 2 }));
        }