2014-10-15 27 views
7

'u kullanan birim sınama kodu OWIN'in web uygulamanızı bellek içinde test etmenizi sağlayan bu harika Microsoft.Owin.Testing kitaplığına sahip olduğunu öğrendim. Ancak, sitem karmaşık yazma testi koduna sahip kaynaklara erişmeden önce kimlik doğrulaması gerektiriyor.OWIN Cookie Authenthication

Microsoft.Owin.Testing'i kullanırken kimlik doğrulaması yapmak için uygun bir yol var mı?

Ünite testlerimin işlem dışı STS'ye vurmasına gerek duymamayı ve bir bellek içi STS'ye (örn. Thinktecture.IdentityServer.v3) karşı programlı olarak oturum açan kod yazmamayı tercih ederim.).

En kolay çözüm, bir fan olmadığım birim testleri için kimlik doğrulama kodunu devre dışı bırakmaktır.

Çerez Kimlik Doğrulama ile OpenID Bağlantısı kullanıyorum. İşte bir örnek. OpenId Connect için yapılandırma dizelerinin gerçek bir sunucu için doldurulması gerekir.

[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()); 
} 

cevap

0

Alay etme, denetleyicinizdeki kodun bir bölümünü sınamaktır. Bir kullanıcı için sahte verileri kullanarak sahte veriler enjekte edebilirsiniz. Kullanıcı sağlayıcı için bir Arayüz oluşturmanız gerekir.

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

ve temel sınıf için enjekte:

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

Bundan sonra şöyle IUserProvider alay edebilirsiniz:

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); 

Bunun size yardımcı olacağını umuyoruz.