2010-09-24 13 views
7

bu kuruluşu ısrar NHibernate kullanıyorum: Id tesiste korumalı Ayarlayıcısı olan nasılYalnızca NHibernate tarafından ayarlanması gereken test edilen korumalı özellikleri nasıl ölçerim?

public class Store 
{ 
    public int Id { get; protected set; } 
    public int Name { get; set; } 
} 

Not. Bu, kullanıcıların Id'u değiştirmelerini engellemek ve NHibernate'in onu veritabanına kaydederken Id atamasına izin vermektir.

benim birim testlerinin birinde

, benim depo dışarı alay aşağıdaki kodla Moq kullanıyorum: Yeni bir Store örneğini döndürmek için Moq anlattığımda

var mock = new Mock<IRepository>(); 
mock.Setup(x => x.GetById<Store>(It.IsAny<int>())) 
    .Returns(new Store { Value = "Walmart" }); // can't set the ID here 

var store = Repository.GetById<Store>(5); 
Assert.That(store.Id == 5); 

, ben atanamıyor ID ve birim testi başarısız olur. Bu özelliği nasıl test edebilirim? Kullanıcıların bunu manuel olarak değiştirmesini istemediğimden, mülkün erişim düzeyini değiştirmek istemiyorum, ancak bunu test etmek için burada yapmak zorunda olduğum tam da buydu.

cevap

8

aslında Mağaza sınıfını test yapmıyorsan, o zaman alay ve SetupGet yöntemi kullanın: Eğer ayarlayıcı yapabilir,

var mock = new Mock<IRepository>(); 
var mockStore = new Mock<Store>(); 
mock.Setup(x => x.GetById<Store>(It.IsAny<int>())).Returns(mockStore.Object); 

mockStore.SetupGet(s => s.Id).Returns(5); 
mockStore.SetupGet(s => s.Value).Returns("Walmart"); 

var store = Repository.GetById<Store>(5); 
Assert.That(store.Id == 5); 
+0

Teşekkür, asla Mağaza nesnesinin kendisinin alay konusu olduğu düşünüldü! –

+1

Hoşgeldin, normalde bunu arayüzlerle kullanıyorum, ancak zaten her şey için NHibernate için sanal olarak sahip olmanız gerektiğinden, bu harika bir uyum. – arootbeer

3

Test projesinde, korunan özelliklerin özelleştirilmesine izin veren Store alt sınıfını oluşturun. Bir Store nesneyi oluşturmak gerektiğinde

class TestableStore : Store { 
    public int TestableId { 
    get { return Id; } 
    set { Id = value; } 
    } 
} 

Ardından kurulum birim testleri bu örneğini iade kullanmak.

mock 
    .Setup(x => x.GetById<Store>(It.IsAny<int>())) 
    .Returns(new TestableStore { Value = "Walmart", TestableId=42 }); 
+0

Bilginize, sadece! Doh @aqwert (I :(düzenlemek için yeterince güçlü değilim) – aqwert

+0

temel sınıf olarak saklayın sınıf eklemek sayesinde ihtiyaç güncelleştirme – JaredPar

+0

Parlak! Eski sonrası ama kullanışlı yaptı! – boolean

10

Bir başka yaklaşım olarak orada bu dışarı atmak için protected internal:

public class Store 
{ 
    public int Id { get; protected internal set; } 
    public int Name { get; set; } 
} 

ve InternalsVisibleTo özellik kullanmak:

[assembly: InternalsVisibleTo("StoreUnitTests")] 
+0

Hey oldukça hoş değil. önce. –

1

Kesinlikle en iyi yaklaşım değil, aynı zamanda özelliği Sharp Architecture's testlerinde yapıldığı gibi ayarlamak için yansımayı da kullanabilirsiniz.

İlgili konular