.Net WebApi2 Mocking FIlter с использованием Owin TestServer - PullRequest
0 голосов
/ 02 ноября 2018

У меня проблемы с фильтрами насмешливых действий для ApiController с использованием Owin TestServer.

По сути, реальная реализация всегда используется вместо фиктивной.

При выполнении теста используется реальное CustomAuthorizationFilter.

То, что я ищу, - это возможность смоделировать эту реализацию, чтобы проверить, как ведет себя фильтр исключений, и весь контроллер отвечает, когда происходит исключение авторизации.

Чего мне не хватает?

Контроллер и фильтр:

[AttributeUsage(AttributeTargets.Method, Inherited = true, AllowMultiple = false)]
public class CustomAuthorizationFilter : AuthorizationFilterAttribute
{
    public override async Task OnAuthorizationAsync(HttpActionContext actionContext, CancellationToken cancellationToken)
    {
        // For the sake of simplicity I'm throwing an exception
        // Real code calls to an internal identity provider 
        throw new NotImplementedException();
    }
}

[HttpGet]
[Route("")]
[CustomAuthorizationFilter]
public async Task<IHttpActionResult> GetAsync()
{
    return Ok();
}

Test and TestServer

[TestMethod]
public async Task TestSomething()
{
  var testServer = CreateTestServer();
  var actualResponse = await testServer.HttpClient.GetAsync("");

  //Assertions
}

protected TestServer CreateTestServer()
{
    Func<IFilter, IFilter> filterProvider = (instance) =>
    {
        //This is not working, the real implementation is the one being executed
        var filter = A.Fake<AuthorizationFilterAttribute>();
        A.CallTo(() => filter.OnAuthorizationAsync(A<HttpActionContext>.Ignored, A<CancellationToken>.Ignored)).Throws<UnauthorizedAccessException>();

        return filter;
    };

    var testServer = TestServer.Create(app =>
    {
        var config = new HttpConfiguration();
        config.Services.Replace(typeof(IAssembliesResolver), new TestWebApiResolver(typeof(MyController)));

        WebApiConfig.Register(config);

        config.Services.Add((typeof(IFilterProvider)), new DelegateFilterProvider(filterProvider));

        app.UseWebApi(config);
    });

    testServer.BaseAddress = new Uri("http://localhost/");

    return testServer;
}

internal class DelegateFilterProvider : IFilterProvider
{
    private readonly Func<IFilter, IFilter> filterProvider;

    public DelegateFilterProvider(Func<IFilter, IFilter> filterProvider)
    {
        this.filterProvider = filterProvider;
    }

    public IEnumerable<FilterInfo> GetFilters(HttpConfiguration configuration, HttpActionDescriptor actionDescriptor)
    {
        var actionFilters = actionDescriptor.GetFilters().Select(instance =>
        {
            // This is where the Filter 
            var filter = filterProvider(instance);

            var result = new FilterInfo(filter, FilterScope.Action);
            return result;
        });

        return actionFilters;
    }
}

Версии библиотеки:

<package id="Microsoft.AspNet.WebApi" version="5.2.6" targetFramework="net472" />
<package id="Microsoft.AspNet.WebApi.Client" version="5.2.6" targetFramework="net472" />
<package id="Microsoft.AspNet.WebApi.Core" version="5.2.6" targetFramework="net472" />
<package id="Microsoft.AspNet.WebApi.Owin" version="5.2.6" targetFramework="net472" />
<package id="Microsoft.AspNet.WebApi.WebHost" version="5.2.6" targetFramework="net472" />
<package id="Microsoft.Owin" version="4.0.0" targetFramework="net472" />
<package id="Microsoft.Owin.Hosting" version="4.0.0" targetFramework="net472" />
<package id="Microsoft.Owin.Testing" version="4.0.0" targetFramework="net472" />
<package id="Owin" version="1.0" targetFramework="net472" />
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...