【问题标题】:Owin.TestServer To Test a Middleware that Requires AuthenticationOwin.TestServer 测试需要认证的中间件
【发布时间】:2016-03-14 19:25:06
【问题描述】:

我有一个中间件方法,需要解析 context.Authentication.User.Identity.Name 才能正确执行。但是,在编写单元测试时,这些属性显然为空,因为没有发生登录。我没有在这个中间件中使用 Oauth 或任何相关的身份验证(除了明显的 name 属性),因为它应该在另一个中间件的其他地方处理(以促进我正在开发的组件的重用/灵活性)。有没有办法模拟/伪造这个值,以便我可以运行我的测试?我已经尝试了我能想到的一切来伪造登录,但我只是停留在这一点上。需要明确的是,中间件需要的值不是 webapi 调用等。

//Arrange
var resolver = A.Fake<IDependencyResolver>();
A.CallTo(() => resolver.GetService(typeof(ISomeService))).Returns(new TestService());

using (var server = TestServer.Create(app =>
{
    app.UseMyMiddleware(new MyMiddlewareOptions()
    {
        DependencyResolver = resolver
    });

    app.Run(async ctx =>
    {
        await ctx.Response.WriteAsync(ctx.Request.Path.Value);
    });
}))
{
    //Act
    var response = await server.CreateRequest("/").GetAsync();

    //Assert
    A.CallTo(() => resolver.GetService(typeof(ISomeService)))
                           .MustHaveHappened(Repeated.Exactly.Once);
    Assert.AreEqual(response.StatusCode, HttpStatusCode.OK);
    //Etc.
}

【问题讨论】:

    标签: unit-testing owin owin-middleware


    【解决方案1】:

    所以这是一种我认为不会对此感到兴奋的方法,但它确实可以完成工作。我会等待接受,因为我认为应该有更好的方法。

    public class TestFakeLoginMiddleware : OwinMiddleware
    {
        public TestFakeLoginMiddleware(OwinMiddleware next) : base(next)
        {
        }
    
        public override async Task Invoke(IOwinContext context)
        {
            var identity = A.Fake<IIdentity>();
            A.CallTo(() => identity.Name).Returns("TEST@domain.local");
            var user = new ClaimsPrincipal(identity);
            context.Request.Context.Authentication.User = user;
            await Next.Invoke(context);
        }
    }
    

    【讨论】:

      【解决方案2】:

      我知道有点晚了,但你能不能不只是创建一个新的 ClaimsIdentity?

      public override async Task Invoke(IOwinContext context)
      {
          var identity= new ClaimsIdentity(new List<Claim> {
              new Claim(ClaimTypes.Name, "TEST@domain.local")
          });
          var user = new ClaimsPrincipal(identity);
          context.Request.Context.Authentication.User = user;
          await Next.Invoke(context);
      }
      

      【讨论】:

      • 我可能必须测试一下看看。本质上,这就是我们通过将假身份传递给属性调用所做的事情。
      猜你喜欢
      • 1970-01-01
      • 2020-03-16
      • 2014-06-30
      • 2021-07-01
      • 1970-01-01
      • 2014-05-31
      • 2018-09-28
      • 2011-04-12
      • 2016-01-19
      相关资源
      最近更新 更多