在ruby中失败后继续断言

时间:2014-05-08 14:12:11

标签: ruby-on-rails ruby assertions testunit

我的断言示例如下,

class test < Test::Unit::TestCase
     def test_users
      begin
       assert_equal(user.name, 'John')
       assert_equal(user.age, 30)
       assert_equal(user.zipcode, 500002)  
      rescue Exception
       raise
      end 

     end   
   end

如果任何一个断言失败,我应该继续处理下一个断言并收集失败断言并在结果结束时显示失败。

我使用了add_failure方法,它用于循环条件

rescue Test::Unit::AssertionFailedError => e
          add_failure(e.message, e.backtrace)

任何人都可以帮忙吗?

3 个答案:

答案 0 :(得分:0)

你的主要问题是assert_equal最终调用assert(如下所示),assert将引发ArgumentException。

文件测试/ unit / assertions.rb,第144行

def assert_equal(exp, act, msg = nil)
  msg = message(msg) {
  # omitted code to save space
 } 
  assert(exp == act, msg)
end

文件测试/ unit / assertions.rb,第29行

def assert(test, msg = UNASSIGNED)
  case msg
  when UNASSIGNED
    msg = nil
  when String, Proc
  else
    bt = caller.reject { |s| s.rindex(MINI_DIR, 0) }
    raise ArgumentError, "assertion message must be String or Proc, but #{msg.class} was given.", bt
  end
  super
end

你可以扩展Test :: Unit :: Assertions并提供一个不会引发ArgumentError的断言,这就是停止继续失败的断言。

请参阅this问题,获取有关朝这个方向发表建议并添加安全断言的建议。

答案 1 :(得分:0)

一个好的单元测试应该测试完全一件事,特别是为了避免你面对的问题。此测试用例将报告所有失败的测试,而不仅仅是第一次失败的测试:

class MyTest < Test::Unit::TestCase
  def test_user_name
    assert_equal(user.name, 'John')
  end

  def test_user_age 
    assert_equal(user.age, 30)
  end

  def test_user_zipcode
    assert_equal(user.zipcode, 500002)  
  end 
end   

答案 2 :(得分:0)

请在Ruby失败后找到以下代码以继续断言:

def raise_and_rescue  
  begin  
    puts 'I am before the raise.'  
    raise 'An error has occured.'  
    puts 'I am after the raise.'  
  rescue  
    puts 'I am rescued.'  
  end  
  puts 'I am after the begin block.'  
end  

输出:

红宝石p045handexcp.rb
我在加薪之前。
我被救了。
我在开始障碍之后。
退出代码:0