Soru Neden MiniTest :: Spec'un bir wont_raise iddiası yok?


Ruby'nin Test::Unit vardır assert_nothing_raised. Test::Unit tarafından değiştirildi MiniTest. Neden MiniTest'in iddiaları / beklentileri buna paralel bir şey yapmıyor? Örneğin bekleyebilirsiniz must_raise Ama değil wont_raise.


29
2017-09-19 16:48


Menşei




Cevaplar:


MiniTest uygular assert_nothing_raised Test :: Birim uyumluluk katmanında, ancak kendi testlerinde (MiniTest::Unit ve MiniTest::Spec) yapar değil Bunun gibi herhangi bir testi uygulayın. Sebebi, programcının öne sürülen hiçbir şeyin test edilmesinin hiçbir şeyin bir testi olmadığını ileri sürdüğü iddia ediliyor; sen asla Test ettiğiniz zamanlar dışında, testte yükseltilecek herhangi bir şey beklemeyin için bir istisna. Bir test için kodda beklenmedik (yakalanmamış) bir istisna meydana gelirse, testte iyi bir şekilde bildirilen bir istisna alırsınız ve bir sorun olduğunu bileceksiniz.

Örnek:

require 'minitest/autorun'

describe "something" do
  it "does something" do
    Ooops
  end
end

Çıktı:

Run options: --seed 41521

# Running tests:

E

Finished tests in 0.000729s, 1371.7421 tests/s, 0.0000 assertions/s.

  1) Error:
test_0001_does_something(something):
NameError: uninitialized constant Ooops
    untitled:5:in `block (2 levels) in <main>'

1 tests, 0 assertions, 0 failures, 1 errors, 0 skips

Tam olarak bilmek istediğin şey bu. Yükseltilecek hiçbir şey beklemiyor olsaydın, anlamadın ve sen de böyle söylendi.

Yani, burada argüman: kullanmayın assert_nothing_raised! Bu sadece anlamsız bir koltuk değneği. Bakınız, örneğin:

https://github.com/seattlerb/minitest/issues/70

https://github.com/seattlerb/minitest/issues/159

http://blog.zenspider.com/blog/2012/01/assert_nothing_tested.html

Öte yandan, açıkça assert_nothing_raised Kullanıcılar arasında bir miktar sezgiye karşılık gelir, çünkü birçok kişi bir wont_raise ile gitmek must_raisevb. özellikle bir odaklanmak ister iddia bunun üzerine, sadece bir test değil. Neyse ki, MiniTest son derece minimalist ve esnektir, bu yüzden kendi rutininizi eklemek isterseniz yapabilirsiniz. Böylece, istisna olmadığını test eden ve istisna yoksa bilinen bir sonuç döndüren bir yöntem yazabilirsiniz ve şimdi bu bilinen sonuç için geçerli olabilirsiniz.

Mesela (bunun mükemmel olduğunu söylemiyorum, sadece fikri gösteriyorum):

class TestMyRequire < MiniTest::Spec
  def testForError # pass me a block and I'll tell you if it raised
    yield
    "ok"
  rescue
    $!
  end
  it "blends" do
    testForError do
      something_or_other
    end.must_equal "ok"
  end
end

Mesele bu iyi ya da kötü bir fikir değil, MiniTest'in sizin için bunu yapmasının hiçbir zaman sorumluluğu değildi.


45
2017-09-19 16:48



+ 1 kullanmayın assert_nothing_raised mükemmel cevap - Lee Jarvis
Mükemmel cevap. assert_nothing_raised bir noop. Bundan kaçınmak daha iyi. Zenspider'in blog gönderisinden yaptığı yorumu şöyle dile getirdim: "Bu, en minnettarın neden tam olarak bu olmadığını gösteriyor. assert_nothing_raised. İşe yaramaz hurda testlerinden sonra dosyayla uğraşıyorsun. " - blowmage
Oluşturduğunuz bazı JSON'ların geçerli olduğunu ve ayrıştırılabilir olduğunu doğrulamak istediğinizi varsayalım, assert_nothing_raised satırları boyunca kod gördüm. JSON.parse (my_method_that_returns_some_json) sonu Ancak, genel durumda yukarıdakileri kabul ediyorum. yorumlar. - Dan Garland
Ruby'de (testForError) ama snake_case (test_for_error) yöntemlerini camelCase olarak adlandırmayın. Ama cevap için +1: yükseltilen hiçbir şey için iddia etmeyin - pascal betz
Tam anlamıyla doğru olsa da, doğru olmayan bir test yazıyorsanız, kodun bir hata atmadığından emin olmak için muhtemelen "bu bir hata oluşturmamalı" şeklinde bir yorum eklemeniz gerekir. iddialar daha tutarlı görünüyor, assert gerçekten ihtiyacın olan tek şey ... assert_false -> kullan !; assert_equal -> kullan ==; vb ... tüm sözdizimsel şeker.


Eğer ihtiyacın olursa:

# test_helper.rb

module Minitest::Assertions
  def assert_nothing_raised(*)
    yield
  end
end

Ve bunu kullanmak için:

def test_unknown_setter
  assert_nothing_raised do
    result.some_silly_column_name = 'value'
  end
end

7
2018-05-11 08:40



İyi bir! Maymun yamaunun büyük bir hayranıyım. - Weston Ganger


Bu, MiniTest kaynaklarına girmek ve benim için bir uygulama sağlamak için beni rahatsız etti. spec_helper.rb dosya:

module MiniTest
  module Assertions
    def refute_raises *exp
      msg = "#{exp.pop}.\n" if String === exp.last

      begin
        yield
      rescue MiniTest::Skip => e
        return e if exp.include? MiniTest::Skip
        raise e
      rescue Exception => e
        exp = exp.first if exp.size == 1
        flunk "unexpected exception raised: #{e}"
      end

    end
  end
  module Expectations
    infect_an_assertion :refute_raises, :wont_raise
  end
end 

Umarım bu da ihtiyaç duyan başka birine yardımcı olur. wont_raise. Şerefe! :)


2
2017-09-01 15:52