2014-10-15 10 views
7

Ich habe gelernt, dass OWIN hat diese große Bibliothek, mit der Sie Ihre Web-Anwendung In-Memory testen können. Meine Website erfordert jedoch eine Authentifizierung, bevor auf Ressourcen zugegriffen werden kann, die das Schreiben von Testcode erschwert haben.Wie Einheit Testcode, der OWIN Cookie Authentifizierung verwendet

Gibt es eine bequeme Möglichkeit, Authentifizierung bei Verwendung von Microsoft.Owin.Testing zu "mock"?

Ich möchte, dass meine Komponententests nicht auf einen veralteten STS treffen müssen, und ich möchte lieber keinen Code schreiben, der sich programmgesteuert bei einem In-Memory-STS anmeldet (z. B. Thinktecture.IdentityServer.v3)).

Die einfachste Lösung, die ich habe, ist, den Authentifizierungscode für die Komponententests zu deaktivieren, von denen ich kein Fan bin.

Ich verwende OpenID Connect mit Cookie-Authentifizierung. Hier ist ein enthaltenes Beispiel. Die Konfigurationszeichenfolgen für OpenId Connect müssen für einen tatsächlichen Server ausgefüllt werden.

[Test] 
public async void AccessAuthenthicatedResourceTest() 
{ 
    const string ClientId = ""; 
    const string RedirectUri = ""; 
    const string Authority = ""; 

    TestServer server = TestServer.Create(
     app => 
      { 
       //Configure Open ID Connect With Cookie Authenthication 
       app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType); 
       app.UseCookieAuthentication(new CookieAuthenticationOptions()); 
       app.UseOpenIdConnectAuthentication(new OpenIdConnectAuthenticationOptions 
        { 
        ClientId = ClientId, 
        RedirectUri = RedirectUri, 
        Authority = Authority 
        }); 

       // Requires Authentication 
       app.Use(
        async (context, next) => 
         { 
          var user = context.Authentication.User; 
          if (user == null 
           || user.Identity == null 
           || !user.Identity.IsAuthenticated) 
          { 
           context.Authentication.Challenge(); 
           return; 
          } 

          await next(); 
         }); 

       app.Run(async context => await context.Response.WriteAsync("My Message")); 
      }); 


    //Do or Bypass authenthication 

    HttpResponseMessage message = await server.CreateRequest("/").GetAsync(); 

    Assert.AreEqual("My Message", await message.Content.ReadAsStringAsync()); 
} 

Antwort

0

Ich denke, Mocking ist ein Teil des Codes in Ihrem Controller zu testen. Sie können gefälschte Daten für einen Benutzer mit Mock injizieren. Sie müssen eine Schnittstelle für den Benutzeranbieter erstellen.

public interface IUserProvider 
    { 
     string GetUserId(); 
     string GetUserName(); 
    } 

und an Ihre Basisklasse injizieren:

protected BaseController(IUnitOfWork data, IUserProvider userProvider) 
     { 
      this.data = data; 
      this.userProvider = userProvider; 
     } 

Danach können Sie die IUserProvider wie so spotten:

var userMockReposioty = new Mock<IRepository<ApplicationUser>>(); 
      var userMockUserProvider = new Mock<IUserProvider>(); 
      userMockUserProvider.Setup(x => x.GetUserName()) 
       .Returns("FakeUserName"); 

      userMockUserProvider.Setup(x => x.GetUserId()) 
       .Returns("c52b2a96-8258-4cb0-b844-a6e443acb04b"); 

mockUnitOfWork.Setup(x => x.Users).Returns(userMockReposioty.Object); 

Ich hoffe, dass diese Ihnen helfen.

Verwandte Themen