RPC远程过程调用,二进制封装,提供高吞吐低延迟的高性能RPC框架
大石头 authored at 2022-08-10 13:26:19
2.02 KiB
NewLife.Remoting
using System;
using System.ComponentModel;
using NewLife.Remoting;
using Xunit;

namespace XUnitTest.Filters;

/// <summary>IActionFilter单元测试</summary>
public class ActionFilterTests
{
    /// <summary>测试用filter实现</summary>
    private class TestFilter : IActionFilter
    {
        public Boolean ExecutingCalled { get; set; }
        public Boolean ExecutedCalled { get; set; }
        public ControllerContext? LastContext { get; set; }

        public void OnActionExecuting(ControllerContext filterContext)
        {
            ExecutingCalled = true;
            LastContext = filterContext;
        }

        public void OnActionExecuted(ControllerContext filterContext)
        {
            ExecutedCalled = true;
            LastContext = filterContext;
        }
    }

    [Fact]
    [DisplayName("Filter执行前回调")]
    public void OnActionExecuting_Called()
    {
        var filter = new TestFilter();
        var ctx = new ControllerContext
        {
            ActionName = "Test/Hello"
        };

        filter.OnActionExecuting(ctx);

        Assert.True(filter.ExecutingCalled);
        Assert.Equal("Test/Hello", filter.LastContext!.ActionName);
    }

    [Fact]
    [DisplayName("Filter执行后回调")]
    public void OnActionExecuted_Called()
    {
        var filter = new TestFilter();
        var ctx = new ControllerContext
        {
            ActionName = "Test/Hello",
            Result = "result"
        };

        filter.OnActionExecuted(ctx);

        Assert.True(filter.ExecutedCalled);
        Assert.Equal("result", filter.LastContext!.Result);
    }

    [Fact]
    [DisplayName("Filter设置Result中断执行")]
    public void OnActionExecuting_SetResult()
    {
        var filter = new TestFilter();
        var ctx = new ControllerContext
        {
            ActionName = "Test/Hello"
        };

        // 模拟在执行前设置Result来中断执行
        filter.OnActionExecuting(ctx);
        ctx.Result = "intercepted";

        Assert.Equal("intercepted", ctx.Result);
    }
}