2013-04-27 11 views
5

Yürütmekte olan bir Seaside uygulamasında Test Driven Development'ı kullanıyorum ve tüm verilerim görüntüdeki nesneler olarak saklanıyor (bir veritabanının aksine).Smalltalk Seaside ile test verileri veya test verileri için eşdeğeri?

ToDoTest>>setUp 
    savedTasks := Task tasklist. 
    Task deleteAllTasks. 

    savedProjects := ToDoProject projectlist. 
    ToDoProject deleteAllProjects. 

    savedPeople := Person peoplelist. 
    Person deleteAllPeople. 

Ve:

ToDoTest>>tearDown 
    Task tasklist: savedTasks. 
    ToDoProject projectlist: savedProjects. 
    Person peoplelist: savedPeople 

benim testleri çalıştırdığınızda böyle test verileri ile çöpe atılan önce

Yani gerçek verileri uzakta saklamak için dikkatli olmak zorunda kalmıştım Sorun, testlerim başarısız olduğunda ortaya çıkıyor, ki bu da tabii ki, bu hata ayıklayıcısını ortaya çıkarır ve sonra gideririm, ama gözyaşı, her zaman aranmaz ve böylece gerçek verilerimi kaybedebilirim.

Verileri dosyalara kaydediyorum, bu yüzden büyük bir sorun değil, ancak olmasını istediğim kadar yumuşak ve otomatik değil.

Neyse bunu geliştirebilir miyim?

cevap

6

Sorunu tamamen giderecek bir senaryo olup olmadığından emin değilim. Asıl sorun, modelin küresel olmasıdır. Bu uygun ve güzel ama böyle bir senaryoda kolayca başarısız oluyor. Bu yüzden, modeli global olarak daha yerelleştirilmiş bir modele dönüştürmeyi düşünürdüm, bu nedenle modelinizi yalnızca üretim amacıyla müdahale etmeden test amaçlı oluşturmak üzere oluşturabilirsiniz.

Mevcut kurulumunuzda düzeltmek için, bir yere aşağıdakileri eklemeniz gerekir: block. Bir emin blok, her şeyin yolunda gitmesi ya da bir hata olsaydı, bir şeyin yürütüldüğünü "garanti eder". Sorun, bir testten önce ve sonra yapmaniz gerektiğidir.

Bu durumda ben

runCase 
    [ self saveRealModel. 
     super runCase ] 
     ensure: [ self restoreRealModel ] 
+0

İlginç. Verileri bir şekilde bölme fikri burada yardımcı olabilir. Örneğin, basit yapılacaklar uygulamasının şu anda hiçbir kullanıcı kavramı yok, bunları ekleyebilir ve ardından birim testleri için bir test kullanıcısı oluşturabilirim. –

+0

Bunu yapmanın birçok yolu var. Verilerinizi yerelleştirmek istiyorsanız kolay bir yol şeyleri sınıftan örnek tarafına taşıyor. ToDoProject ana sınıfınızsa sınıf tarafındaki yöntemleri örnek tarafına taşıyın. ToDoProject >> # taskList, ToDoProject >> # projectList'e sahip olursunuz ... İlk adımda ToDoProject'u tek bir tonaj yapabilirsiniz, böylece ToDoProject sınıfı >> # varsayılanı ToDoProject örneğini gerçek verilerinizle döndürür.Sahil parçanızın bir instVar "projesi" olacaktır. Ardından, bileşeninizi gerçek kullanım için "ToDoProject varsayılanı" ile yapılandırırsınız ve "ToDoProject new" öğesini ayarladığınız test için –

2

Ah gibi bir şey ile kendi deney sınıfında TestCase >> # runCase üzerine yazılacağı, bu güzel bir test koku. Norbert, test edilmiş modelinizin muhtemelen küresel olmamasına dikkat etmekte haklı. Çoğu test, tek tek nesneler arasındaki etkileşim üzerinde olmalıdır. Film Şeridi'nde biz kullanıcıları bir GirişNoktası ile sınıf instancevar kullanıcılarla

DEUser subclass: #SBUser 
    instanceVariableNames: 'email initials projects invitations' 
    classVariableNames: '' 
    poolDictionaries: '' 
    category: 'StoryBoard-Data' 

var. Projelere sadece kullanıcılar aracılığıyla ulaşılabilir. domain

Iteration>on: aProject 
    ^self new 
     project: aProject; 
     yourself 

Bu dizge kendisi veya ayrı geçmesine izin veren nesneler için

users 
    ^users ifNil: [ users := OrderedCollection with: (SBAdministrator new 
     userid: 'admin'; 
     password: 'admin'; 
     yourself) 
    ] 

ve bir yol (onları

resetUsers 
    " SBUser resetUsers " 
    users := nil 

Genelde oluşturma bağımlılıkları iletebilirsiniz temizlemek için sahte) nesne