2013-03-07 36 views
5

Bir animasyonu tetikleyen bir düğmeye basıyorum ve animasyonu tamamladıktan sonra bir etiketin metnini değiştirir. Bir test yazmak istiyorum, butona basıldığında, etiketin metninin düzgün bir şekilde değiştiğini doğrular.iOS TDD: UIVIew animateWithDuration kullanan bir yöntemin sınanması: animasyonlar: tamamlama:

IBAction düğmesine basıldığında, [UIView animateWithDuration:animations:completion:] kullanılacaktır. Açıkçası benim birim testimin bir animasyonun tamamlanması için 0,5 saniye beklemesini istemiyorum.

UIView'le dalga geçmeyi düşündüm, ancak UIView'i bir denetleyiciye bağımlı olarak enjekte etmek tuhaf görünüyor. Ayrıca, kullanıyorum alay çerçeve (OCMockito) alay sınıf yöntemleri ile iyi çalışmıyor gibi görünmüyor.

Ben de yöntem swizzling veya completion: bloğun ardından animations: blok UIView için bir test kategorisi yazma ve hiçbir şey yapmaz bir uygulama kullanarak ancak çağırmak düşündü. Bu benim için biraz bozuk görünüyor; UIView üzerinde bir sınıf yönteminin uygulanmasının geçersiz kılınmasının, yoldaki istenmeyen sonuçları olabileceğinden endişeleniyorum.

TDD'ye yeni olan, burada en iyi uygulamanın ne olduğundan emin değilim. Bu, "UI twiddling" olarak düşünülmesi gereken ve bu yüzden test edilmeden bırakılması kabul edilebilir kod parçalarından biri mi? Yoksa bunu özlediğimi test etmenin daha açık bir yolu var mı?

cevap

4

Animasyonun uzunluğunu belirleyen ve varsayılan değeri 0,5 saniyeye ayarlayan bir özellik yapalım.

Bu şekilde, testiniz animasyon süresini 0 olarak ayarlayabilir ve etiketin metninin beklemeden güncelleneceğini gözlemleyebilir.

Bu, dependency injection'dır ve TDD ile yeni başlıyorsanız çok kullanışlıdır. Ayrıca kodunuzu daha modüler ve daha az eşleştirecek güzel yan etkiye sahiptir.

+0

Bu konuyla ilgili merak: Animasyonun test tamamlanmadan önce çalışacağına dair bir garanti var mı? Bu animasyon bloğu bir şekilde bir sebepten dolayı gecikebilir mi? – Ying

+1

Bu aslında iyi bir nokta. Animasyon runloopta sıraya girecek ve normalde testin geri dönüşünden sonra animasyonun gerçekleşeceği anlamına gelir. Bununla birlikte, <= 0 süresiyle animasyon yapmak, değişikliğin hemen gerçekleşmesine neden olan özel bir durumdur. –

+1

@Benoit animasyonu süresinin 0 veya daha az olması, tamamlanma blokunu hemen çağırmaz. 0 süre bile olsa, sonraki çalışma döngüsündeki bloğu çağırıyor olabilir. Yaptığım şey, GCD gecikme bloğu içindeki iddiaları çağırmak. Çözümümü açıklamak için ayrı bir cevap verdim. –

İlgili konular