2010-11-23 25 views
9

Şu anda kimlik doğrulaması için varsayılan SqlMembershipProvider kullanan bir asp.net mvc 2 uygulaması geliştiriyorum. Geçerli kullanıcının ProviderUserKey'ini Membership.GetUser().ProviderUserKey numaralı telefonu arayarak okuyan bir denetleyici yöntemi uyguladım. Şimdi bu denetleyici için bazı test yöntemleri yazmaya çalışıyorum.Bir Üyelik Alıkoyma

statik Üyelik sınıfına dependancy kurtulmak için, ben ince bir sarmalayıcı oluşturulur ve benim denetleyicisi tekabül eden arayüz bağlıdır yaptık:

public interface IStaticMembershipService { 
    MembershipUser GetUser(); 

    void UpdateUser(MembershipUser user); 
} 

Şimdiye kadar her şey çalışır, ancak birimine sırayla denetleyiciyi deneyin, hala bu arabirimin GetUser() yöntemini alayım ve bir ProviderUserKey özelliği içeren bir MembershipUser nesnesi döndürmeniz gerekir. Böyle bir nesneyi yapmanın en kolay yolu nedir?

Alaycı çerçeve olarak moq kullanıyorum. Buna benzer

cevap

11

Bu şuna benzer ediyorum: ProviderUserKey sanal değilse

var membershipMock = new Mock<IStaticMembershipService>(); 
var userMock = new Mock<MembershipUser>(); 
userMock.Setup(u => u.ProviderUserKey).Returns(guid); 
membershipMock.Setup(s => s.GetUser()).Returns(userMock.Object); 

MembershipUser sınıfı yani (alay yaramak etmezse), bir MembershipUser nesnesinden gereksinim duyacağınız değerleri temsil etmek için kendi nesneyi oluşturmak ve servisinizin bunlardan birini iade etmesini isteyeceksiniz.

bir MembershipUser bir poco benzeri bir nesne olduğunu da hafif bir ihtimal var ve bir böyle örneğini oluşturabilirsiniz: Sana arayüzden tüketici gerçekten uygulanması özelliklerini ayırmak gerektiğini düşünüyorum

var userMock = new MembershipUser {ProviderUserKey = guid}; 
+0

sayesinde iyi çalışıyor. – Simon

1

şey:

var user = new MembershipUser(); 
var membershipService = new Mock<IStaticMembershipService>(); 
membershipService.Setup(p => p.GetUser()).Returns(user); 
2

umurunda. Sizin kontrolünüzün belirli bir sınıfa, vb. Atarsa, sizin için ne yapması gerektiğinden emin değilim, fakat ara yüzünüzü denetçinin ihtiyaçlarını karşılamaya çalışıyorum. (Daha fazla ayrıntı bilmeden) gibi bir şey:

membershipService.Setup (svc => svc.UserKey).Returns (myGuid); 

Bir başka düşünce, yerine çalışırken: Eğer soyutlama bu düzeyde yaptığınızda aynı senin çünkü

public interface IMembershipDetailsService { 
    Guid UserKey { get; } 
} 

sonra alay, çok daha kolay hale gelir Daha fazla saplama için gereken tüm bir MembershipUser nesnesini döndürmek için.

+0

+1 Çok iyi puan. – StriplingWarrior

0

HttpContext öğelerini aşmanız gerekiyorsa aşağıdaki gibi bir şey yapabilir misiniz? Aşağıdaki NUnit ve Moq kullanıyor. MembershipUser sınıfının bir taklidini yaratarak bir çok

[SetUp] 
private void Setup() 
{ 
    _mockHttpContext = new Mock<HttpContextBase>(); 
    _mockStaticMembership = new Mock<IStaticMembershipService>();   
    _mockUser = new Mock<MembershipUser>(); 
    _mockPrincipalUser = new Mock<IPrincipal>();   

    _mockHttpContext.Setup(http => http.User).Returns(_mockPrincipalUser.Object); 
    _mockPrincipalUser.Setup(principal => principal.Identity.Name).Returns("myname"); 
    _mockUser.Setup(user => user.ProviderUserKey).Returns(Guid.NewGuid()); 

    _mockStaticMembership.Setup(membership => membership.GetUser(It.IsAny<string>())).Returns(_mockUser.Object); 

} 

[Test] 
public void Some_Test_For_My_Controller() 
{    
    var controller = new MyController(_mockStaticMembership.Object);    
    controller.ControllerContext = new ControllerContext(_mockHttpContext.Object, new RouteData(), controller); 

    //Test your action and verify 
} 
İlgili konular