Bir hizmet için bazı test otomasyonu üzerinde çalışıyorum ve bir "oturum" sınıfına genel kurulum & doğrulamasının düzgün bir yolunu buldum. Ben vb rolü başına doğru kimlik doğrulaması ile test ediyorum servisiyle bağlantı kurmak Oturum nesne YapıcıdaHerhangi bir istisnanın atılmış olup olmadığını nasıl kontrol edebilirim?
using (var managerSession = new Session(managerRole))
{
// A manager puts some items in warehouse
}
using (var employeeSession = new Session(employeeRole))
{
// An employee moves items from warehouse to store
}
using (var customerSession = new Session(customerRole))
{
// A customer can buy items from the store
}
ve oturum imhası içinde:
Kavramsal olarak, bir test durumu şöyle görünebilir() yöntemi Ortak bir doğrulama bloğum var, örneğin, oturum ömrü boyunca sunucu tarafı hataları veya uyarılarının yükseltilmediğini denetler.
Şimdi, elbette, bu bir çeşit örüntüyü kötüye kullanmaktır ve eğer bir test blokları içindeki test kodu bir istisna atarsa ve doğrulama bloğu da bir istisna atarsa, ikinci istisna ilkini maskeleyecektir. Bu senaryo varsa
Kavramsal olarak,:
using (var managerSession = new Session(managerRole))
{
Assert.IsTrue(managerSession.DoJob(), "Manager did not do his job");
}
... ve assert başarısız veya managerSession.DoJob() çağrısı bir istisna atar, sonra ben için Oturum Dispose() yöntemini istiyorum doğrulama bloğu atlamak, yani test yöntemi asla aslında
'işini yapmadı Yöneticisi' ile başarısız olursa 'Hizmet bağlantı hatalar var' ile başarısız şekildepublic void Dispose()
{
if (NoExceptionThrown())
{
Assert.IsFalse(this.serviceConnection.HasErrors(), "Service connection has errors");
}
this.serviceConnection.Dispose();
}
...Sorum şu: 'NoExceptionThrown()' yöntemini uygulamak mümkün mü? Kullanılabilen ThreadCurrentThread'de kontrol edilebilen bazı gizli özellikler var mı?
Güncelleme:
Sorum şu değil
Tabii onun yerine bu desen kullanabilirsiniz bu :-) refactor nasıl: (
Session.ForRole(managerRole, (session) => { /* Test code here */ });
statik yöntemle ForRole ile)
public static void ForRole(Role r, Action<Session> code)
{
var session = new Session(r);
try
{
code(session);
Assert.IsFalse(session.serviceConnection.HasErrors());
}
finally
{
session.Dispose();
}
}
Ancak, yukarıda tarif edildiği gibi istisna durumunu ele geçirmenin bir yolunun olup olmadığını merak ediyorum.
İki şey. Birincisi, evet, bu 'IDisposable' kötüye. "Mümkün olan en kısa sürede serbest bırakılması gereken yönetilmeyen bir kaynağa sahibim" anlamına gelen "IDisposable" ifadesini kullanın. Başka bir şey yapmak, kodunuzun okunmasını zorlaştırır. İkincisi, herhangi bir * istisna ya da sadece * yakalanmamış * istisnalar hakkında endişe duyuyor musunuz? Test kodunun bir istisna attığını, yakaladığını ve normal şekilde tamamlandığını varsayalım. İşaretlenmeli mi? –
Ah, sadece _uncaught_ istisnaları hakkında endişeliyim. Sorunu güncelleyeceğim ... – Christoffer
Kimlik hırsızlığı kötüye kullanımla ilgili olarak: Aslında her oturumda hataların olası maskelemesinden ziyade ortak geçerliliği kaçırmayla ilgili kaygılarım var, bu yüzden bu soru 'sahip olmaktan hoşnut' bir özellik. Test kodlarının gerçek blokları 10-100 satır UI otomasyon kodudur ve doğrulama hatalarından biri bloklardan birinde (veya yanlış blokta rapor edilmiş) atlanmış olduğundan, tespit edilmemiş kusurları tespit ettik. – Christoffer