protected override void Execute(object parameter)
 {
     if (ActionMethod != null && ActionTargetReference.IsAlive)
     {
         ActionMethod.Invoke(ActionTargetReference.Target, new object[] { (T)parameter });
     }
 }
示例#2
0
        public async Task Should_call_action(ActionMethod actionMethod)
        {
            var requestGraph = RequestGraph
                               .CreateFor(actionMethod)
                               .AddDefaultResponseStatus();
            var routeDescriptor = requestGraph.GetRouteDescriptor();

            requestGraph.AddResponseWriter1(c => c.Response.ToString().CreateTextResponse().ToTaskResult());
            requestGraph.AddRequestBinder1(c => SetArguments(requestGraph.ActionMethod,
                                                             c, (a, p) => a[p.Position] = $"value{p.Position}"));
            requestGraph.AddRequestBinder2(c => SetArguments(requestGraph.ActionMethod,
                                                             c, (a, p) => a[p.Position] += $"-{p.Position}"));

            var invoker = CreateInvoker(requestGraph);
            var handler = Substitute.For <IHandler>();

            handler.Response().ReturnsForAnyArgs(x => "response");
            handler.ResponseAsync().ReturnsForAnyArgs(x => "response".ToTaskResult());
            handler.ParamsAndResponse(null).ReturnsForAnyArgs(x => "response");
            handler.ParamsAndResponseAsync(null).ReturnsForAnyArgs(x => "response".ToTaskResult());

            var response = await invoker.Invoke(handler);

            var expectedArguments = actionMethod.MethodDescriptor.Parameters.Select(p =>
                                                                                    $"value{p.Position}-{p.Position}").Cast <object>().ToArray();

            await actionMethod.Invoke(handler.Received(1), expectedArguments);

            if (routeDescriptor.HasResponse)
            {
                response.StatusCode.ShouldEqual(HttpStatusCode.OK);
                var responseText = await response.Content.ReadAsStringAsync();

                responseText.ShouldEqual("response");
            }
            else
            {
                response.StatusCode.ShouldEqual(requestGraph
                                                .Configuration.DefaultNoResponseStatusCode);
            }
        }