2010-03-29 12 views
5

IPrincipal üzerinde yazdığım bir uzantı yöntemi için bazı birim testleri yazıyorum. hizmet vermek amacıyla, yardımcı sınıflar bir çift (kısalık için ihmal edilmiş arayüzleri değil-uygulanan üyeleri için bazı kodu) yarattık: salt okunur AncakSalt okunur üye içeren bir arabirim için bir birim sınama saplaması nasıl oluşturulur?

public class IPrincipalStub : IPrincipal 
{ 
    private IIdentity identityStub = new IIdentityStub(); 

    public IIdentity Identity 
    { 
     get { return identityStub; } 
     set { identityStub = value; } 
    } 
} 

public class IIdentityStub : IIdentity 
{ 
    public string Name { get; set; } // BZZZT!!! 
} 

, IIdentity arayüzünde Name özelliği (IIDentity arabirimi bir getter belirtir, ancak Name özelliği için bir belirleyici değildir).

Arabirim salt okunur özellik olarak tanımlanmışsa, sınama amacımdaki Name özelliğini sınama amacıyla nasıl girebilirim?

+0

Oluşturucu? i.e 'IIdentityStub', Name parametresini alan parametreli bir kurucuya sahip olacaktır. – shahkalpesh

+0

"BZZZT" iniz bir derleme hatası mıydı? Numunenizi iyi bir şekilde derleyebildim (Identity özelliğinde w/yarı-virgüller, yani). – micahtan

+0

@micahtan: Evet, ama buna karşı bir sınama yazmaya çalıştığınızda ve sınamadaki "Name" değerini ayarladığınızda, derleyici "Name" öğesinin salt okunur olduğundan şikayet edecektir. IIDentity 'tanımlanmış bir tanımlayıcı yok. –

cevap

3

C# 'nin otomatik özellikler özelliğini kullanıyorsunuz, ancak bunun yerine manuel rotayı kullanmanız ve özellik için bir arka alan yaratmanız gerekiyor. Bir destek alanına sahip olduğunuzda, değerini yapıcıya ayarlayabilirsiniz (ya da bunu ortak bir alan haline getirin ve nesneyi aldıktan sonra ayarlayın, ancak bu biraz daha çirkin bir şeydir). Alaycı/izolasyon çerçevesinde kullanmak -

public class IIdentityStub : IIdentity{ 
    private string _name; 

    public IIdentityStub(string name){ 
     _name = name; 
    } 

    public string Name { get { return _name; } } 
} 
+0

Değeri yapıcı tarafından ayarlanamazsa, tasarımınızla ilgili bir sorununuz vardır. –

+0

Mükemmel, teşekkürler. –

+0

@Robert Harvey: Sorun değil efendim. –

1

Ben NMock

+1

Doğru, ama önce kendi saplarımın nasıl yazılacağını daha iyi öğreneceğimi düşündüm. –

2

Ben juharr katılıyorum gibi Mock kitaplığını kullanarak öneriyoruz. Moq'u öneririm.

"Robert" yazdırır şu:

using System; 
using System.Security.Principal; 
using Moq; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main() 
     { 
      var mockIdentity = new Mock<IIdentity>(); 
      var mockPrincipal = new Mock<IPrincipal>(); 

      mockIdentity.SetupGet(x => x.Name).Returns("Robert"); 
      mockPrincipal.SetupGet(x => x.Identity).Returns(mockIdentity.Object); 

      IPrincipal myStub = mockPrincipal.Object; 

      Console.WriteLine(myStub.Identity.Name); 
     } 
    } 
} 

DÜZENLEME: Ama

using System; 
using System.Security.Principal; 

namespace ConsoleApplication2 
{ 
    class Program 
    { 
     static void Main() 
     { 
      IIdentity identity = 
       new IdentityStub 
        { 
         Name = "Robert", 
         AuthenticationType = "Kerberos", 
         IsAuthenticated = true 
        }; 

      IPrincipal principal = new PrincipalStub(identity); 

      Console.WriteLine(principal.Identity.Name); // Robert 
      Console.WriteLine(principal.IsInRole(PrincipalStub.ValidRole)); // True 
      Console.WriteLine(principal.IsInRole("OtherRole")); // False 
     } 
    } 

    public class PrincipalStub : IPrincipal 
    { 
     public const string ValidRole = "TestRole"; 

     public PrincipalStub(IIdentity identity) 
     { 
      Identity = identity; 
     } 

     public IIdentity Identity { get; private set; } 

     public bool IsInRole(string role) 
     { 
      return role == ValidRole; 
     } 
    } 

    public class IdentityStub : IIdentity 
    { 
     public string Name { get; set; } 
     public string AuthenticationType { get; set; } 
     public bool IsAuthenticated { get; set; } 
    } 
} 

(yukarıda değil bir olduğunu ... elle yapmak istiyorsanız birim testi, biraz bağımlılık enjeksiyonu kullanarak el-haddelenmiş taslakların sadece bir örneği.)