【问题标题】:How to extend Ruby Test::Unit assertions to include assert_false?如何扩展 Ruby Test::Unit 断言以包含 assert_false?
【发布时间】:2011-11-24 17:33:23
【问题描述】:

显然在 Test::Unit 中没有 assert_false。您将如何通过扩展断言并添加文件config/initializers/assertions_helper.rb 来添加它?

这是最好的方法吗?我不想修改test/unit/assertions.rb

顺便说一句,我不认为这是多余的。我正在使用assert_equal false, something_to_evaluate。这种方法的问题是很容易误用assert false, something_to_evaluate。这将始终失败,不会引发错误或警告,并且会在测试中引入错误。

【问题讨论】:

标签: ruby-on-rails ruby ruby-on-rails-3 unit-testing assertions


【解决方案1】:

如果您使用 MiniTest(在 Ruby 1.9+ 中替换了 Test::Unit),那么您可以使用 refute 方法,它是 assert 的逆方法。

【讨论】:

    【解决方案2】:

    我个人认为assert_falserefute 更好,因为它与所有其他断言一致,而且通常也更符合语义(类似于使用if !condition 而不是unless)。

    如果你也有同感并想要assert_false,请添加到test/test_helper.rb

    class ActiveSupport::TestCase
    
      ...
    
      def assert_false(test, message="Expected: false. Actual: #{test}.")
        assert_equal false, test, message
      end
    
    end
    

    编辑:请注意,如果 test 为 nil,assert !test(在其他地方建议)将不起作用(!nil 为真,我们可能希望 assert_false(nil) 失败)。所以这是与false 的直接比较。

    【讨论】:

      【解决方案3】:

      Rails 4 有 assert_not 可以满足您的需求。

      test "requires valid url" do
        @mymodel.url = "bogus!"
        assert_not @mymodel.valid?
      end
      

      【讨论】:

        【解决方案4】:

        只需在您要断言的内容前添加一个 bang:

        assert !(something_false)
        

        【讨论】:

          猜你喜欢
          • 2018-03-11
          • 2014-09-29
          • 2013-07-07
          • 1970-01-01
          • 2011-11-28
          • 2021-07-23
          • 1970-01-01
          • 1970-01-01
          • 2012-04-21
          相关资源
          最近更新 更多