2011-01-05 19 views

cevap

8

QGraphicsView birim testini denemeye çalışırken sorunlarla karşılaşıyorum. Benim en büyük sorun

Fare olay

QTest::mousePressEvent(view, Qt::LeftButton, 0); 

sonuç "MousePress" konsola nmak widget'ı

alarak kabul edilmedi ve benim olay işleyicileri denilen alma asla olmasıydı. Bulduğum çözüm görüntü alanına olayı göndererek değil, QGraphicsView kendisi:

olması gerektiği gibi benim QGraphicsView alt sınıfa olayı gönderir
QTest::mousePressEvent(view->viewport(), Qt::LeftButton, 0); 

. Bu, grafik öğelerinizin olayları uygun şekilde aldığından emin olmak için tüm grafik görünümünüzü yüksek bir seviyeden test etmenizi sağlar.

Şimdi, gerçek sorularınız için.

Grafik yoğun sınıflar notoriouslyhard - test içindir. Bağlantılı sayfalardan bazı tavsiyelerde bulunmak gerekirse, (1) mantığa ve sunumun mümkün olduğunca olabileceğini ve (2) çok düşük seviyelerde test yapmamayı öneririm.

Sunumdan ayırma mantığı genellikle iyi bir uygulamadır, ancak mantığınızın büyüklüğü sunumu oluştururken harcanması zor olabilir! QGraphicsItem nesneleri durumunda, bizim için olayları simüle etmek için uygun QTest işlevlerine sahip değiliz. Yani

void MyGraphicsItem::pressed(const QPointF &pos, const QPointF &last) 

kullanın semantik türlerini kullanarak anlamlı olaylar senin aslında mesela testler değil QGraphicsSceneEvent alt sınıfları, sırasında inşa edebilir yanıtlamak için sınıfları tasarım ardından mousePressEvent yöntem QGraphicsSceneMouseEvent ilgili bilgileri ayıklamak ve kendi aramasını pressed yöntem. Testleriniz daha sonra yönteminizi kullanacaktır ve yapay QGraphicsSceneEvents oluşturma konusunda endişelenmenize gerek kalmayacaktır.

testinin ne kadar zor olduğunu test etmek oldukça zordur. Örneğin, grafik öğelerinin konumlarını testlerinize kodlamak istemezsiniz. Grafik motoru sizin altınızda değiştiğinde ve öğeleriniz biraz farklı bir şekilde oluşturulduğunda ne olur? Bunun yerine, anlamsal olarak anlamlı testlere konsantre olmalısınız. Bu iki nesne çarpışıyor mu? Seçtiğimde bu ürünün rengi değişir mi?

Buradaki temel fikir, sınıflarınızı QGraphicsView düzeyine değil, uygulamanızın semantik seviyesine göre tasarlamak ve test etmektir. QGraphicsSceneEvents öğesinin çevirisini uygulamanızın etkinliklerine test eden, iyi yapılandırılmış birkaç test isteyebilirsiniz, ancak bunların testlerinizin çoğundan daha hassas olacağını anlayabilirsiniz.

+0

Bağlantımdaki soru hakkında bir fikrim var mı? Viewport() kullanılarak QGraphicsItem, bu yöntemi kullanarak fare kapmak öğesi olarak ayarlanmış gibi görünmüyor? – paulm