SORU
11 AĞUSTOS 2010, ÇARŞAMBA


Birim EF4 "Kod İlk" ve Depo ile test

En son EF4 CTP Kod İlk yaklaşım kullanarak yaptım Birimi için çok basit bir ASP.NET test kolu MVC test uygulaması için çalışıyorum. Birim testi ile çok deneyim vb alay etmiyorum.

Bu Depo benim sınıf

public class WeightTrackerRepository
{
    public WeightTrackerRepository()
    {
        _context = new WeightTrackerContext();
    }

    public WeightTrackerRepository(IWeightTrackerContext context)
    {
        _context = context;
    }

    IWeightTrackerContext _context;

    public List<WeightEntry> GetAllWeightEntries()
    {
        return _context.WeightEntries.ToList();
    }

    public WeightEntry AddWeightEntry(WeightEntry entry)
    {
        _context.WeightEntries.Add(entry);
        _context.SaveChanges();
        return entry;
    }
}

Bu İWeightTrackerContext

public interface IWeightTrackerContext
{
    DbSet<WeightEntry> WeightEntries { get; set; }
    int SaveChanges();
}

...ve uygulanması, WeightTrackerContext

public class WeightTrackerContext : DbContext, IWeightTrackerContext
{
    public DbSet<WeightEntry> WeightEntries { get; set; }
}

Benim test, ben şu var:

[TestMethod]
public void Get_All_Weight_Entries_Returns_All_Weight_Entries()
{
    // Arrange
    WeightTrackerRepository repos = new WeightTrackerRepository(new MockWeightTrackerContext());

    // Act
    List<WeightEntry> entries = repos.GetAllWeightEntries();

    // Assert
    Assert.AreEqual(5, entries.Count);
}

Ve benim MockWeightTrackerContext:

class MockWeightTrackerContext : IWeightTrackerContext
{
    public MockWeightTrackerContext()
    {
        WeightEntries = new DbSet<WeightEntry>();
        WeightEntries.Add(new WeightEntry() { Date = DateTime.Parse("01/06/2010"), Id = 1, WeightInGrams = 11200 });
        WeightEntries.Add(new WeightEntry() { Date = DateTime.Parse("08/06/2010"), Id = 2, WeightInGrams = 11150 });
        WeightEntries.Add(new WeightEntry() { Date = DateTime.Parse("15/06/2010"), Id = 3, WeightInGrams = 11120 });
        WeightEntries.Add(new WeightEntry() { Date = DateTime.Parse("22/06/2010"), Id = 4, WeightInGrams = 11100 });
        WeightEntries.Add(new WeightEntry() { Date = DateTime.Parse("29/06/2010"), Id = 5, WeightInGrams = 11080 });
    }

    public DbSet<WeightEntry> WeightEntries { get;set; }

    public int SaveChanges()
    {
        throw new NotImplementedException();
    }
}

Benim sorunum yok oluşturucu gibi DbSet<> oluşturamıyorum olarak bazı test verileri oluşturmak için çalışıyorum oluşur. Yaklaşımımın benim bağlam dalga geçmeye çalışıyor yanlış kapıyı çalıyorsun olduğumu hissediyorum. Herhangi bir tavsiye bu tam birim test çaylak için de harika olurdu.

CEVAP
12 AĞUSTOS 2010, PERŞEMBE


Fabrika yöntemi aracılığıyla bir DbSet oluşturun() bağlama ama birim testi EF üzerinde herhangi bir bağımlılık istemiyorum. Yapıyor bakmak gerekir bu nedenle, DbSet bir saplama İDbSet arabirimi veya bir Saplama Adedi veya RhinoMock gibi Alay çerçeveler birini kullanarak hayata geçiriyor. Kendi Saplama yazdığını varsayarsak sadece bir iç hashset için WeightEntry nesneleri eklemek istiyorum.

Sen ObjectSet ve İObjectSet arıyorsanız, daha fazla şans birim testi EF hakkında öğrenme olabilir. Bu kodu ilk önce CTP yayın DbSet ve bir birim test açısından çok onlar hakkında daha fazla yazılı kopyaları.

İşte EF kodu test edilebilirlik anlatılır MSDN'DE excellent article. İObjectSet kullanır ama yine de alakalı olduğunu düşünüyorum.

David'in yorum yanıt olarak bu bağlayamıyorum-yorum ek olarak aşağıda ekliyorum. Eğer bu uzun yorum için en iyi yöntem ise emin değilim tepkiler?

Bu İWeightTrackerContext arayüzü DbSet somut bir tip yerine WeightEntries özelliğinden bir İDbSet dönmek için değiştirmeniz gerekir. Sonra da alaycı bir çerçeve (önerilen) veya kendi özel saplama ile bir MockContext oluşturabilirsiniz. Bu WeightEntries özelliğinden bir StubDbSet dönecekti.

Şimdi de kod (ı.olacak e Özel Havuzları) İWeightTrackerContext uygulamak, Varlık Çerçevesi sizin WeightTrackerContext geçer misiniz İWeightTrackerContext bağlıdır. Bu yapıcı enjeksiyon Birlik gibi IoC çerçeve kullanılarak yapılabilir eğilimindedir. Test için depoyu kodu bağlı EF istiyorsunuz geçişte sizin MockContext uygulama kodu altında test düşünüyor konuşuyor "gerçek" EF ve veritabanı ve davranır (umarım) beklendiği gibi. Değiştirilebilir harici db sisteminde bağımlılığın kaldırılması ve EF gibi o zaman güvenilir bir birim testleri depo aramaları kontrol edebilirsiniz.

Alay çerçeveleri büyük bir kısmını test davranışlarına Mock nesneleri çağırır doğrulama olanağı sağlamaktadır. Endişelerini MS olmamalı Bu test aslında DbSet Ekle test sadece yukarıda örnek işlevselliği için birim testleri olacak. Bilmek isterdim ne DbSet Eklemek için çağrı uygunsa ve Sahte çerçeveler ise kendi depo kodu içinde yapıldı.

Üzgünüm bu özet ama eğer bu madde bir çok ile bir okudum Scott Allen benden daha çok bunları açıklayan daha iyi olduğu için daha net olacak:) çok fazla olduğunu biliyorum

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • David Wills

    David Wills

    31 Aralık 2007
  • discokatze

    discokatze

    23 EYLÜL 2009
  • Sali Kaceli

    Sali Kaceli

    24 ŞUBAT 2009