SORU
13 Mart 2012, Salı


Sahte çerçeve vs MS Sahte çerçeveler

Biraz VS vs NMock 2011 gibi Sahte çerçeveler farklar karıştı Çerçeve Sahte. Neler yaşadığını MSDN, tek anladığım Sahte izin ver seninle alay senin bağımlılıklar gibi RhinoMock veya NMock, ancak yaklaşımı farklı, Sahte oluşturur koduna ulaşmak bu işlev, ama Alay çerçeve değil. Yani benim anladığım doğru mu? Sahte sadece başka bir Sahte çerçeve

CEVAP
27 EYLÜL 2012, PERŞEMBE


Senin soru hakkında nasıl MS Sahte çerçeve farklıdır NMock ve görünür diğer cevapları çözüldü biraz, ama burada biraz daha fazla bilgi konusunda nasıl olduklarını ve nasıl onlar farklı. NMock onları NMock ile gruplandırma ben de RhinoMocks ve Adedi benzer.

Hemen arasında NMock/RhinoMocks/Adedi ve MS Sahte Çerçeve görüyorum 3 büyük farklılıklar vardır:

  • MS sahte çerçevesinde oluşturulan kod, Visual Studio önceki sürümlerde Set yerine genel türler gibi kullanır. Ne zaman kullanmak istediğiniz sahte çerçeve için bir bağımlılık ekleyin içeren bir derleme bağımlılığı için başvurular projesinin ve sonra sağ tıklatın oluşturmak için test iki katına (koçanları veya levhaları). Test ederken, aslında yerine bu oluşturulan sınıfları kullanıyorsunuz. NMock jenerik aynı şeyi gerçekleştirmek için kullanır (6* yani *). Benim görüşüme göre, MS aslında oluşturulan bir sınıf, gerçek arayüzü değil karşı çalıştığına göre testler içinde çerçeve yaklaşımı engeller kod navigasyon ve yeniden düzenleme yapıyor.

  • MS koçanları ve NMock, RhinoMocks ve Adedi taslakları bulunur oysa tüm benler (levhaları) ve çerçeve malzemeleri sahtealay ediyor. Gerçekten MS alay ve ben, sebep, aşağıda açıklandığı için benler hayranı şahsen karar anlamıyorum.

  • MS sahte çerçevesinde, saplama istediğiniz yöntemleri için alternatif bir uygulama sağlayın. Bu diğer uygulamalar içinde, ya da eğer bu yöntem çağrıldı dönüş değerleri belirleyin ve bilgileri takip edebilirsiniz. NMock, RhinoMocks ve Adedi ile, sahte bir nesne oluşturur ve bu nesne tarafından dönüş değerleri belirtmek için veya etkileşim ve nasıl yöntemler aramış olup olmadığını takip etmek için kullanın. MS sahte yaklaşımı daha karmaşık ve daha az etkileyici buluyorum.

Çerçeveler sağlar ne farkı netleştirmek için: NMock, RhinoMocks ve Adedi bütün test çiftler iki tür bulunur (koçanları ve alay). Sahte çerçeve koçanları ve mol (onları levhaları diyorlar) sağlar, ve ne yazık ki alay içermez. NMock ve MS Sahtesi arasındaki benzerlik ve farklılıkları anlamak için yardımcı test çiftler bu farklı anlamak önemlidir:

Yer tutucular:Koçanları test altındaki yöntemi ile test çiftlerde istenecek yöntemleri veya özellikleri için değerleri sağlamak için gerektiğinde kullanılır. Test altında benim yöntem DoesStudentExist çağırdığında örneğin, () İStudentRepository test yöntemi çift, doğru dönmek istiyorum.

NMock ve MS sahte koçanları fikri aynı ama NMock böyle bir şey yapacağını:

Stub.On(mockStudentRepository).Method("DoesStudentExist").Will(Return.Value(true));

Ve MSFakes böyle somethign.

IStudentRepository studentRepository = new DataAccess.Fakes.StubIStudentRepository() // Generated by Fakes.
{
    DoesStudentExistInt32 = (studentId) => { return new Student(); }
};

Fark MS Sahte örnek oluşturmak için tamamen yeni bir uygulama DoesStudentExist yöntemi (Not denir DoesStudentExistİnt32 çünkü sahte çerçeve ekler parametre veri türleri için yöntem adları oluşturur saplama nesneler, bence bu gizler netlik testleri). Dürüst olmak gerekirse NMock uygulama yöntemi de adını tanımlamak için bir dize kullanır, çünkü beni deli ediyor. (Eğer kullanılmak üzere tasarlanmıştır nasıl yanlış yaptım eğer beni affet.) Bu yaklaşım gerçekten yeniden düzenleme engeller ve yüksek RhinoMocks tavsiye ya da bu nedenle NMock Adedi yanına giderdim.

Alay:Alay test altındaki yöntemi ve bağımlılıkları arasındaki etkileşim doğrulamak için kullanılır. NMock, beklentilerini buna benzer ayarlayarak bunu yapabilirsiniz:

Expect.Once.On(mockStudentRepository).Method("Find").With(123);

Bu başka bir nedeni neden tercih ederdim RhinoMocks ve Adedi üzerinden NMock, NMock kullandığı eski stil beklentisi ise RhinoMocks ve Adedi hem destek Hizmeti/Act/Onaylama yaklaşımı nerede belirttiğiniz beklenen etkileşimleri gibi iddialar sonunda test: bunun gibi

stubStudentRepository.AssertWasCalled( x => x.Find(123));

Yine RhinoMocks yöntemi tanımlamak için bir dize yerine bir lambda kullandığını unutmayın. Ms sahte çerçeve alay hiç sağlamaz. Bu saplama dışarı uygulamaları (yukarıda koçanları tanımına bakın), daha sonra doğrulamak doğru ayarlanmış değişkenleri ayarlamak zorunda anlamına gelir. Bu gibi bir şey olacaktır:

bool wasFindCalled = false;

IStudentRepository studentRepository = new DataAccess.Fakes.StubIStudentRepository() 
{
    DoesStudentExistInt32 = (studentId) => 
        { 
            wasFindCalled = true;
            return new Student(); 
        }
};

classUnderTest.MethodUnderTest();

Assert.IsTrue(wasFindCalled);

Bu yaklaşım çağrısı saplama parça ve test daha sonra iddia var o zaman beri biraz karmaşık buluyorum. Bu NMock ve özellikle RhinoMocks, örnekler daha anlamlı buluyorum.

Mol (Levhaları):Dürüst olmak gerekirse, benler, çünkü suistimal potansiyeli sevmiyorum. Birim testi hakkında çok sevdiğim şeylerden (ve özellikle TDD) kodunuzu test zavallı kodunun yazılı olduğu anlamak için yardımcı olur. Bu kötü yazılmış kodu test etmek zor olmasıdır. Bu benler aslında sana enjekte olmayan bağımlılıklara karşı test etmek için izin vermek için özel yöntemler test etmek için tasarlanmıştır çünkü benler kullanırken doğru değildir. Aynı şekilde böyle bir ShimsContext kullandığınız hariç taslakları için çalışıyorlar,:

using (ShimsContext.Create())
{
    System.Fakes.ShimDateTime.NowGet = () => { return new DateTime(fixedYear, 1, 1); };
}

Altlıklar ile benim endişe insanlar "birim test için daha kolay bir şekilde yazmak için zorlamaz, çünkü" seni gerektiği gibi kod olarak görmeye başlayacaktır. Daha kapsamlı bir rapor bu kavram benim bu mesajı görmek için:

Bazı endişeleri sahte ile ilgili daha fazla bilgi için çerçeveler bu mesajlar bir göz atın:

Eğer ilgileniyorsanız öğrenme RhinoMocks işte Pluralsight eğitim videosu (tam açıklama - yazdığım bu ders ve para ödenecek telif görünümleri, ama bence geçerli bu tartışma bu yüzden ben dahil olmak üzere burada):

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • DrePwn

    DrePwn

    22 Temmuz 2011
  • ELPRESADOR

    ELPRESADOR

    21 HAZİRAN 2008
  • Roger Huffman

    Roger Huffma

    4 ŞUBAT 2007