2016-03-23 6 views
1

Lein test İşlevlerimi rasgele sırada çalıştırır.Testi zincirlemek için bir yol, diğeri clojure'da peş peşe koşuyor mu?

Aynı verileri değiştiren iki işlevim var. İlk önce birinciye ve ikincisine ihtiyacım var.

;;===============my file============= 
;;this fails if x and y are not found. 
(defn create-data [x y] 
    (go add x y)) 

;;if the update function doesn't find x and y it adds them so create-data fails when it runs after update-data 
(defn update-data [x y] 
    (go update x y)) 

;;======my file test======= 
(deftest create-test 
    (testing "this should run first" 
    (is (= 20 create-data))) 

(deftest create-test 
    (testing "this should run second" 
    (is (= 20 update-data))) 

yüzden o iş yapacak hem fonksiyonları için bir test oluşturma düşündüm ama öyle değil: Benim testte sipariş

Örnek firles.

(deftest test-create-update. 
    (testing "this should run second" 
    (is (= 20 create-data)) 
    (is (= 20 update-data))) 

ben hem işlevleri çalışır ama ilk kesin ve bakılmaksızın (başarılı veya başarısız olsun) sonucun oluşturmak-verilerini çalışacaktır update-verileri çalışacaktır şey istiyorum. Her ikisine de ihtiyacım var. Bireysel olarak çalışırlar. ama otomatik testlere ihtiyacım var.

+0

Sanırım 'clojure.test' tüm sınama işlevlerini bir ad alanından yakalar ve tanımlandıkları sıralamayı korumaz. Bir 'test'de birden çok' '' ifadesi olan durumunuzun çalışmadığından emin misiniz? Ben denedim ve benim için çalışıyor (ilk 'başarısız' olsa bile 'ikinci bir' değerlendiriliyor '). Ayrıca 'create-data 've' update-data' işlevlerini çağırmıyorsunuz, ancak bunları 20'den 20'ye fonksiyon nesneleri olarak karşılaştırıyorsunuz. Tek bir' deftest 'yerine belirli bir sınama gerektiren testlerinizin yerine getirilmeyip farklı' sınama 'içine yerleştirilemez. örneklerini? –

+0

Bence en çirkin vakalar kendi kendine yeten bir varlıktır. Siparişi zorlamak istiyorsanız, hepsini bir teklemenin içine koymanın daha iyi olduğunu düşünmüyor musunuz? –

cevap

2

Test ortamlarını oluşturmak ve yıkmak için test fikstürlerini kullanabilirsiniz. Bu, tüm testler veya her test için yapılabilir.

use-fixtures Bkz: Birkaç ad üzerinde sipariş zorlamak istiyorsanız

; Here we register my-test-fixture to be called once, wrapping ALL tests 
; in the namespace 
(use-fixtures :once my-test-fixture) 

, sen my-test-fixture bunları sarabilirdiniz.

0

Her iki işlev için bir sınama oluşturma sezginiz iyi bir yaklaşımdır. Yaşadığınız sorun büyük olasılıkla test ile ilgili değil.

(go add x y) gönderdiğiniz kod, core.async kullandığınızı önerir. bazı sorunlar vardır: sonucunu bloke sürece, bir şeyin olduğu garanti edilmez, böylece

  1. , bloklar "bir süre sonra" yürütüldüğünde bir kanal ve içlerindeki kodu döndürebilir gidin.
  2. (go add x y) hiçbir işlevi gerçekleştirmez, yalnızca y döndürür. Büyük olasılıkla (!< (go (add x y)))
  3. 'u isteyebilirsiniz. Bir atom veya ref veya benzerleri aracılığıyla bazı durumu değiştirmedikçe hiçbir şey değişmeyecektir.

Buradaki asıl sorunun testlerle değil kodla olduğuna inanıyorum. Ya da eğer kod "işe yarıyorsa" o zaman testinizde engelleme yapmanıza gerek yoktur. go ve add'un içeriğinizde neler olduğuna dair daha fazla bilgi verebilir misiniz?

+0

gidin ve ekleyin sadece rastgele isimler çünkü burada çalıştığım gerçek kodu yazmak istemedim. –

İlgili konular