Soru Test :: Unit'te global kurulum ve gözyaşı blokları


Tüm test paketinin tümünde (yalnızca bir test sınıfında değil) her bir metottan önce kurulum çalışmasının en iyi yolu nedir?

Rspec, genel olarak blokları önce ve sonra tanımlamanıza olanak tanır. Her bir test sınıfına bir modülün karıştırılmasını içermeyen Test :: Unit'te bunu yapmanın temiz ve karşılaştırılabilir bir yolu var mı?


21
2017-11-15 04:16


Menşei


+1 bile bilmek istedim. - Chirantan
Ben de bununla gerçekten ilgileniyorum. Ben salatalık ile mongoid kullanıyorum ve testler arasında db temizlemek için tüm örnekleri Rspec kullanın. Her bir testte, global olanla birlikte bireysel kurulum / gözyaşı yöntemleri kullanmama izin vermediğinden aşağıdaki çözümü gerçekten beğenmiyorum. - brad
olası kopyası Ruby's Test :: Unit :: TestCase'de, başlatma yöntemini nasıl geçersiz kılarım? - Andrew Grimm


Cevaplar:


Sadece yama yapabilirsin Test::Unit::TestCase ve tanımla setup yöntem:

class Test::Unit::TestCase
  def setup
    puts 'in setup'
  end
end

Alt sınıflarınız bunu varsayılan olarak kullanır:

class FooTest < Test::Unit::TestCase
  def test_truth
    assert true
  end
end

class BarTest < Test::Unit::TestCase
  def test_truth
    assert true
  end
end

Bir test vakasının kendi kurulumuna sahip olması gerekiyorsa, aramanız gerekecektir. super İlk olarak global kurulumun çalışmasını sağlamak için:

class BazTest < Test::Unit::TestCase
  def setup
    super
    puts 'custom setup'
  end

  def test_truth
    assert true
  end
end

Küresel bir kurulum yapmak gerçekten yapmanız gereken bir şey mi yoksa tanımlanmış bir yardımcı yönteme sahip olmanıza yardımcı olur mu? Test::Unit::TestCase ve buna ihtiyaç duyan testlerde bunu mu? Yardımcı yöntem yaklaşımı, projelerimde faydalı bulduğum bir şey - kurulum durumu ve niyet her bir testte daha açık ve bazı "gizli" kurulum yöntemlerini bulmak için etrafta dolaşmam gerekmiyor. Genelde, küresel bir kurulum, tasarımınızın bir parçasını yeniden gözden geçirmeniz gerektiğini belirten bir kod kokusu, ancak YMMV.

Güncelleştirme

ActiveSupport'u kullandığınız için, burada bir çağrı gerektirmeyen bir şeyde ilk bıçak var. super her tanımladığınızda setup Test durumunuzda yöntem. Ne kadar değerli olduğunu bilmiyorum, çünkü farklı bir yönteme çağrı gerektiriyor ve herhangi bir geliştirici sadece kendi setup Bu değişikliğin geçerliliğini geçersiz kılacak yöntem. İşte burada:

require 'rubygems'
require 'test/unit'
require 'active_support'
require 'active_support/test_case'

class ActiveSupport::TestCase

  def setup_with_global
    puts 'In Global setup'
    setup_without_global
  end

  alias_method_chain :setup, :global

end

class FooTest < ActiveSupport::TestCase

  def setup_without_global
    puts 'In Local setup'
  end

  def test_truth
    assert true
  end

end

7
2017-11-15 11:05



Bu projede, bazı global bellek önbelleklerini temizlemek gerekiyor, böylece test senaryoları birbirini kirletmiyor. Genel olarak bunun bir miktar koku olduğuna inanıyorum, ancak IMO, geliştiricilerin bir yardımcısı çağırmayı ve bazen öngörülemeyen sonuçlarla başa çıkmayı hatırlamasını gerektirdiğinden daha mantıklı. Kurmayı tanımlayan her alt sınıfta süper aramak zorunda kalmanın bir yolu olup olmadığını merak ediyorum. ActiveSupport :: TestCase bu özelliği kurulumları / gözyaşları ile sağlıyor mu? - samg
Özgün cevaba ekledim - bu çözümün size yaklaştığından emin değilim. - Patrick Reagan
Şüphesiz en iyi çözüm, 'süper' yaklaşımı kullanmaktır. Alias_method_chain kullanmayın. - Tim Harper
İçin +1 alias_method_chain - mikeycgto


Rails kullandığınızı varsayalım. Sadece aşağıdakileri ekleyin test/test_helper.rb dosya.

class ActiveSupport::TestCase
  setup :global_setup

  def global_setup
    #stuff to run before _every_ test.
  end
end

Raylar 3.0.9 üzerinde test edilmiştir.


23
2017-08-16 11:10



Yerel kurulum yönteminin ilk olarak adlandırıldığından emin olmanın bir yolu var mı? - Isaac Betesh
@IsaacBetesh Hayır, sanmıyorum. Ancak, kodunuzda bir geçici çözüm bulabileceğinizden oldukça eminim. Bu, zincirlemenin oldukça standart bir yoludur - "yerel kurulumdan önce ortak kurulum". (Bunu bir "olgu" olarak satmama rağmen, sadece bunun bir istisnadan ziyade bir kural olduğunu ve karşı örnekler olabileceğini söylüyorum). - Vikrant Chaudhary