SORU
27 AĞUSTOS 2008, ÇARŞAMBA


Nasıl veritabanı sorguları ile bir nesnenin birim test için

Duydum birim testi "kesinlikle harika", "çok iyi" ve "her şekilde iyi şeyler" ama p veya daha fazla dosyaları içeren veritabanı erişimi (oku ve yaz) ve nasıl emin değilim yazmak için bir birim test için bu dosyalar.

PHP ve Python kullanıyorum ama veritabanı erişimi kullanan tüm dilleri/çoğu için geçerli bir soru olduğunu düşünüyorum.

CEVAP
27 AĞUSTOS 2008, ÇARŞAMBA


Veritabanı aramaları alay dışarı öneririm. Alay temelde bir yöntem çağırmak için çalıştığınız nesne gibi görünen nesneler, özellikler, yöntemler, vs. ikisi de aynı anlamda. arayan için kullanılabilir. Ama belirli bir yöntem çağrıldığında yapmak için programlanmış ne olursa olsun gerçekleştirmek yerine, o tamamen atlar, ve sadece bir sonuç verir. Bu sonuç, genellikle önceden tanımlanmış.

Alay nesneleri ayarlamak için, muhtemelen bağımlılık enjeksiyon desen/ kontrol, pseudo-kod aşağıdaki gibi ters bir çeşit kullanmanız gerekir:

class Bar
{
    private FooDataProvider _dataProvider;

    public instantiate(FooDataProvider dataProvider) {
        _dataProvider = dataProvider;
    }

    public getAllFoos() {
        // instead of calling Foo.GetAll() here, we are introducing an extra layer of abstraction
        return _dataProvider.GetAllFoos();
    }
}

class FooDataProvider
{
    public Foo[] GetAllFoos() {
        return Foo.GetAll();
    }
}

Birim testi şimdi, aslında veritabanı vurmak zorunda kalmadan yöntemi GetAllFoos aramak için izin verir FooDataProvider, bir alay oluşturmak.

class BarTests
{
    public TestGetAllFoos() {
        // here we set up our mock FooDataProvider
        mockRepository = MockingFramework.new()
        mockFooDataProvider = mockRepository.CreateMockOfType(FooDataProvider);

        // create a new array of Foo objects
        testFooArray = new Foo[] {Foo.new(), Foo.new(), Foo.new()}

        // the next statement will cause testFooArray to be returned every time we call FooDAtaProvider.GetAllFoos,
        // instead of calling to the database and returning whatever is in there
        // ExpectCallTo and Returns are methods provided by our imaginary mocking framework
        ExpectCallTo(mockFooDataProvider.GetAllFoos).Returns(testFooArray)

        // now begins our actual unit test
        testBar = new Bar(mockFooDataProvider)
        baz = testBar.GetAllFoos()

        // baz should now equal the testFooArray object we created earlier
        Assert.AreEqual(3, baz.length)
    }
}

Ortak alaycı bir senaryo, özetle. Tabii ki yine de muhtemelen kendisi için veritabanı vurmak gerekir gerçek bir veritabanı aramaları da, birim test yapmak isteyecektir.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Besnik Ibrahimi

    Besnik Ibrah

    27 Mart 2010
  • Garrett Müller

    Garrett Mül

    26 HAZİRAN 2009
  • THELIFEOFPRICE

    THELIFEOFPRI

    16 Mart 2011