Testler için özel ayarlayıcılarla Stubbing Properties


10

Nesnemiz var

public class MyObject{
    protected MyObject(){}

    public string Property1 {get;private set;}
    public string Property2 {get;private set;}
    public string Property3 {get;private set;}
    public string Property4 {get;private set;}
    public string Property5 {get;private set;}
    public string Property6 {get;private set;}
    public string Property7 {get;private set;}
    public string Property8 {get;private set;}
    public string Property9 {get;private set;}
    public string Property10 {get;private set;}
}

Üretim kodumuzda bu nesneyi automapper ile dolduruyoruz. Özelliklere erişebilir ve bunları doğru şekilde ayarlayabilir.

Şimdi bu sınıfı gelecekteki bir boru hattında test etmek istediğimizde, özellikleri kukla değerlerle (test edilecek) doldurmak mümkün değildir.

Kullanabileceğiniz birkaç seçenek vardır.

  • Özel kurucular için gerekli parametreleri kabul etmek için test ve özellikleri ayarlamak, şu anda 3 kurucu gereklidir. Oluşturucular herhangi bir işlevsellik sunmadığından bu temiz değildir.

  • Sınıfın gizlenebilmesi için özellikleri sanal yapın. Ancak özellikleri sanal olarak işaretlemek herhangi bir iş değeri sağlamaz ve sınıfımı kirletmez.

  • Nesneyi dahili olarak oluşturmak için sınıfa bir nesne oluşturucu ekleyin. Yine katma değer yok. Belki biraz daha temiz ama yine de etki alanı nesnelerinde çok alakalı olmayan kod.

Burada herhangi bir öneri, tavsiye veya alternatif seçenek var mı?

Yanıtlar:


8

Birkaç seçeneğiniz var.

  • Devam edin ve özel oluşturucular, sanal özellikler veya bir nesne oluşturucu kullanın. Bunun arkasındaki mantık, bir nesnenin kendi başına durması ve otomat gibi bir sihire bağlı olmamasıdır. Biraz sihir olmadıkça tamamen işe yaramaz bir sınıf, çok iyi düşünülmüş bir sınıf değildir. "İş değeri" iyi bir tasarımın tek belirleyicisi değildir.

  • Otomatik haritayı test sürecine dahil edin. Bazıları bunun artık bir birim test olmadığını söyleyecek. Farketmez. Birim testi tek tür test değildir.

  • Özellikle test için otomatik haritanın işlevini sağlayan bir şey uygulayın. Nesnenizi özellik adları ve değerleri içeren bir sözlükten doldurmak için yansımayı kullanacak küçük bir yardımcı program kolayca yazabilirsiniz.

Ayrıca şu soruya ve cevabına bir göz atın: Özel şeyleri testler için dahili / herkese açık hale getirmeyi mi yoksa PrivateObject gibi bir tür hack kullanmayı mı tercih edersiniz?


3

Testlerde böyle şeyler için yansıma kullanmaktan çekinmeyin.

Yanlış nedenden dolayı kodu değiştirdiği için alay etmek için sanal şeyler yapmak sevmiyorum.

Automapper'ı bilmiyorum ama testlere dahil etmenin iyi bir fikir olabileceğini @Mike ile hemfikirim. Ayırma birimi testi / entegrasyon testi çok ilginç değil imo. Test takımı büyüyor ve yavaşlıyorsa, tüm testlerin yalnızca makul bir alt kümesini en yüksek frekansta çalıştırmak için filtrelemeniz ve sınıflandırmanız gerekir.

Yansıma kullanarak örnek kesmek, nameof () kullanarak daha iyi perf olacak ama sonra türleri gevşek .:

public static class TestExtensions
{
    public static void SetProperty<TSource, TProperty>(
        this TSource source,
        Expression<Func<TSource, TProperty>> prop,
        TProperty value)
    {
        var propertyInfo = (PropertyInfo)((MemberExpression)prop.Body).Member;
        propertyInfo.SetValue(source, value);
    }
}

0

Birim sınama amacıyla, özel üyelerin alay edilmesini destekleyen Microsoft Fakes, TypeMock ve JustMock gibi alaycı çerçevelerden yararlanın.

Lütfen Smocks'a da bakınız (avaiable @nuget paketleri). Smocks'ın sınırlandırılması, özel üyelere erişim sağlamayacağıdır. Ancak statik ve sanal olmayan üyeleri alay etme yeteneğine sahiptir. Ayrıca ücretsiz olarak mevcuttur.

Bir başka basit yol da PrivateObject / PrivateType kullanmaktır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.