1

適切な実行のためにcontext.Authentication.User.Identity.Nameを解決する必要があるミドルウェア メソッドがあります。ただし、単体テストを作成する場合、サインインが発生していないため、これらのプロパティは明らかに null です。別のミドルウェアの他の場所で処理する必要があるため (私が開発しているコンポーネントの再利用/柔軟性を促進するため)、このミドルウェアに関連する Oauth やその他の認証は使用していません (明らかな名前のプロパティを超えて)。テストを実行できるように、この値をモック/偽造する方法はありますか? サインオンを偽造するために考えられるすべてのことを試しましたが、この時点で立ち往生しています。明確にするために、ミドルウェアには 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.
}
4

2 に答える 2

0

少し遅くなりましたが、新しい 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);
}
于 2016-07-05T13:47:32.067 に答える
0

だから、これは私がそれに興奮していないと思う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);
    }
}
于 2016-03-14T20:05:25.820 に答える