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
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.
Nasıl birim test soyut sınıflar için: ...
'un hangi birim-test için en iyi ...
Nasıl RequireJS birim test için sahte ...
Nasıl django'bellek sadece test v...
Nasıl C dosya sistemi dışarı alay mı# ...