public async Task TestMethodWithParameters()
        {
            var methods = new TestMethods();
            var method  =
                methods.GetType().GetTypeInfo().GetMethods().Single(x => x.Name == nameof(TestMethods.MethodWithParameters));

            var methodInvoker = new MethodInvoker(method, null, null);
            await methodInvoker.Invoke(methods, new object[] { "asd", 123, this });

            Assert.True(methods.MethodWithParametersInvoked);
        }
        public async Task TestMethodWithInvalidAmountParameters()
        {
            var methods = new TestMethods();
            var method  =
                methods.GetType().GetTypeInfo().GetMethods().Single(x => x.Name == nameof(TestMethods.MethodWithParameters));

            var methodInvoker = new MethodInvoker(method, null, null);
            await Assert.ThrowsAsync <IndexOutOfRangeException>(
                async() => await methodInvoker.Invoke(methods, new object[] { "asd", 123 }));

            Assert.False(methods.MethodWithParametersInvoked);
        }
        public async Task TestMethodWithInvalidTypeParameters()
        {
            var methods = new TestMethods();
            var method  =
                methods.GetType().GetTypeInfo().GetMethods().Single(x => x.Name == nameof(TestMethods.MethodWithParameters));

            var methodInvoker = new MethodInvoker(method, null, null);
            await Assert.ThrowsAsync <InvalidCastException>(
                async() => await methodInvoker.Invoke(methods, new object[] { 123, "123", true }));

            Assert.False(methods.MethodWithParametersInvoked);
        }
        public async Task TestMethodWithReturnValue()
        {
            var methods = new TestMethods();
            var method  =
                methods.GetType().GetTypeInfo().GetMethods().Single(x => x.Name == nameof(TestMethods.MethodWithReturnValue));

            var   methodInvoker = new MethodInvoker(method, null, null);
            var   task          = methodInvoker.Invoke(methods, null);
            await task;

            Assert.True(methods.MethodWithReturnValueInvoked);

            var result = await Assert.IsType <Task <string> >(task);

            Assert.Equal("test", result);
        }