Qt4'teki grafik görünümü mimarisini kapsamlı bir şekilde kullanan bir uygulama var ve ben, UI bileşenlerinin otomatik olarak test edilmesini başlatmak istiyorum, ancak ben ile ilgili herhangi bir kaynak bulamıyorum Qgraphicsview/qgraphicswidget tabanlı sınıfları nasıl test edeceğimi veya test etmem gerektiğini?Nasıl birim testi qt grafikleri görüntüle widget'leri/öğeleri görüntüle
cevap
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 benimQGraphicsView
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.
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.
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