2012-03-23 15 views

Odpowiedz

8

Jeśli masz 1.9, nie używaj Test :: Unit :: TestCase jako klasy bazowej. Podklasa go i zastąpić #run_test do uratowania, podjąć zrzut ekranu i przebić:

class MyAbstractTestCase < Test::Unit::TestCase 
    def run_test(*args) 
    super(*args) 
    rescue 
    snapshot() 
    raise 
    end 
end 

Alternatywnie, i myślę, że to jest rzeczywiście najbardziej zwięzły sposób można użyć hak before_teardown:

class MyTestCase < Test::Unit::TestCase 
    add_teardown_hook do |tc| 
    screenshot() unless tc.passed? 
    end 
end 

To nie zadziała w teście/jednostce 1.8, ale z minitestem w wersji 1.9.

3

Cóż można rozszerzyć Test::Unit::Assertions, aby zrobić to, co chcesz, nie sądzę, nie ma wbudowany sposób, aby to zrobić. Być może coś takiego (szybkie & brudny):

require 'test/unit' 

module Test::Unit::Assertions 
    def safe_assert(test, msg=nil) 
    passed = msg.nil? ? assert(test) : assert(test,msg) 
    ensure 
    puts 'take screenshot' unless passed 
    end 
end 

class MyTest < Test::Unit::TestCase 
    def setup 
    puts 'setup' 
    end 

    def teardown 
    puts 'teardown' 
    end 

    def test_something 
    safe_assert true 

    puts 'before failing assert' 
    safe_assert false, "message" 
    puts 'after failing assert' 
    end 
end 

wyjściowa:

Loaded suite unittest 
Started 
setup 
before failing assert 
take screenshot 
teardown 
F 
Finished in 0.001094 seconds. 

    1) Failure: 
test_something(MyTest) [unittest.rb:5]: 
message 

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

Test run options: --seed 58428 

EDIT: można rzeczywiście przekazać args do assert w prostszy sposób:

module Test::Unit::Assertions 
    def safe_assert(*args) 
    passed = assert(*args) 
    ensure 
    puts 'take screenshot' unless passed 
    end 
end 

również, możesz opakować standard assert w bloku begin - - -- end, jeśli potrzebujesz tylko ta funkcja rzadko:

class MyTest < Test::Unit::TestCase 
    def test_something 
    safe_assert true 

    puts 'before failing assert' 
    begin 
     passed = assert false, "message" 
    ensure 
     puts 'take screenshot' unless passed 
    end 
    puts 'after failing assert' 
    end 
end 

lub można zbudować metodę zapewniającą zrzut ekranu podobny do poniższego przykładu. To wydaje się być dla mnie najczystszym sposobem:

def screenshot_on_fail 
    passed = yield 
ensure 
    puts 'take screenshot' unless passed 
end 

class MyTest < Test::Unit::TestCase 
    def test_something_else 
    screenshot_on_fail do 
     assert true 
    end 

    screenshot_on_fail do 
     assert false, 'message' 
    end 
    end 
end 
+0

To wygląda na dobry sposób, dzięki! –

+0

nie ma za co! nie zapomnij przyjąć odpowiedzi, jeśli to rozwiązało twój problem :) –

+0

Sprawdź moją edycję, jest rzeczywiście o wiele czystszy sposób na to, co przyszło mi do głowy w tej chwili ':)' –

Powiązane problemy