2016-04-18 25 views
5

Ön koşullara sahip Swift yöntemleri için nasıl test yaparsınız?Hızlı kodun önkoşullarla test edilmesi

Konu 1:

func testDoublePositive() { 
    XCTAssertEqual(10, testObject.doublePositive(5)) // Works 
    XCTAssertThrowsError(testObject.doublePositive(-1)) // Breaks 
} 

Bu testi çalıştıran bir hata oluşturur:

func doublePositive(n:Int) -> Int { 
    precondition(n >= 0) 
    return 2*n 
} 

çalışmıyor XCTAssertThrowsError kullanma: İşte bir örnek EXEC_BAD_INSTRUCTION (Kod = EXCI386_INVOP, Altkod = 0x0)

Önkoşulu test etmenin bir yolu var mı Swift'ler mi?

+2

Önkoşulda "yakalama" başarısızlığı için standart bir yol yoktur, her zaman programı durduracak, bazı ince ayarlamalar olsa da, http://www.cocoawithlove.com/blog/2016/02/02 /partial-functions-part-two-catching-precondition-failures.html – ogres

+0

@ogres Wow, bu güzel bir makale, teşekkürler! – dasblinkenlight

+0

Test dışı kodda bunu görmek için sabırsızlanıyorum. Test etmeyi denediğin şeyi test etmene izin verdiğine sevindim, ama bu web sitesinden nefret ediyorum ... çünkü bu uygulamanın ana hedeflerinde uygulandığını ve uygulamanın çökmesini önlemek için çökmüş konuların yetim kaldığını garanti ediyorum. (Ve ben de öyle dedim, çünkü benzer Objective-C makalesi için olduğunu gördüm ...) – nhgrif

cevap

3

Ön koşullara sahip Swift yöntemlerini, yalnızca bu ön koşullara uyan girdileri olan davranışları sınayarak test edersiniz. Önkoşullar yerine getirilmediği zaman davranışlar, önkoşullar standart kütüphaneye dönüştürüldüğünden, daha fazla test yapılmadan nettir.

Bir önşartı doğru bir şekilde belirttiğinizden şüpheniz varsa, önkoşul ifadesini bir Boole işlevine çekebilir, sonra geçersiz girişlerden geçerli olarak doğru bir şekilde ayırt etmek için bunu sınayabilirsiniz. hile yapacağını önkoşulu/onaylama işlemi başarısız olduğunda istisnalar oluşturmak için

bir seçenek:

Ancak, burada istediğine kendin için oluşturabilir ayıklama oluşturur tek bunu açmak ve çevirin serbest bırakıldığında oluşur. Bunun yerine Apple'ın precondition, kendi işlevini yazabilirsiniz çağıran

, require, derler. Bu şartlı olarak dilediğiniz gibi davranmak için derlenmiş olabilir. Daha sonra, precondition'u kullandığınız her yerde bunu kullanırsınız.

+0

Kendi fonksiyonumu yapmak iyi bir fikir, teşekkürler! – dasblinkenlight

İlgili konular