2016-03-14 2 views
1

У меня есть метод промежуточного программного обеспечения, для которого требуется context.Authentication.User.Identity.Name, которое должно быть разрешено для правильного выполнения. Тем не менее, при написании модульного теста эти свойства, очевидно, равны нулю, поскольку никакого входа не было. Я не использую Oauth или что-либо аутентификацию, связанную с этим промежуточным программным обеспечением (за пределами очевидного свойства имени), поскольку его следует обрабатывать в другом месте другого промежуточного программного обеспечения (чтобы способствовать повторному использованию/гибкости компонента, который я разрабатываю). Есть ли способ издеваться/подделывать это значение, чтобы я мог запустить свой тест? Я пробовал все, что мог придумать, чтобы подделать вход, и я просто застрял в этой точке. Чтобы быть понятным, для промежуточного программного обеспечения требуется значение, а не вызов webapi или тому подобное.Owin.TestServer для тестирования промежуточного программного обеспечения, требующего проверки подлинности

//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. 
} 

ответ

0

Так вот, один из способов, я полагаю, не в восторге от этого, но он выполняет эту работу. Я буду ждать, чтобы согласиться, поскольку я полагаю, что должен быть лучший способ.

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("[email protected]"); 
     var user = new ClaimsPrincipal(identity); 
     context.Request.Context.Authentication.User = user; 
     await Next.Invoke(context); 
    } 
} 
0

Немного поздно, я знаю, но не могли бы вы просто создать новое свойство ClaimsIdentity?

public override async Task Invoke(IOwinContext context) 
{ 
    var identity= new ClaimsIdentity(new List<Claim> { 
     new Claim(ClaimTypes.Name, "[email protected]") 
    }); 
    var user = new ClaimsPrincipal(identity); 
    context.Request.Context.Authentication.User = user; 
    await Next.Invoke(context); 
} 
+0

Возможно, мне пришлось бы это проверить и посмотреть. По сути, это то, что мы делаем, передавая поддельную идентификацию в вызов свойства. – Shawn

 Смежные вопросы

  • Нет связанных вопросов^_^