Minitest中出现Undefined method: assert_not_nil的错误

5

我尝试执行以下代码,但是它会给我一个未定义的方法错误:

require 'minitest/autorun'
require 'string_extension'

class StringExtensionTest < Minitest::Test
  def test_humanize_returns_nothing
    assert_not_nil "Yo".humanize, "humanize is returning nil."
  end
end

我正在尝试执行来自Codeschool Rails课程的此代码,但似乎没有assert_not_nil方法。 我也检查了MiniTest框架的文档,它也没有定义,但我不确定。

4个回答

6
这里 你可以找到由MiniTest定义的断言列表。
如你所见,assert_not_nil未被定义。虽然MiniTest没有定义许多可能的断言,但任何断言都可以用最简单的assert来定义。
对于你具体的情况:
assert result != nil

你可以传递自定义信息。
assert result != nil, "Expected something to not be nil"

那就是我需要知道的信息,以便我是否应该改用MiniTest::Test还是坚持使用Test::Unit::TestCase。基本的assert不会产生可读的错误消息,所以我选择了Test::Unit::TestCase - Martin

6

assert_not_nil只是refute_nil的别名,但它仅适用于Rails,而不是标准的Minitest。将你的测试更改为扩展ActiveSupport::TestCase应该可以解决这个问题:

class StringExtensionTest < ActiveSupport::TestCase
  def test_humanize_returns_nothing
    assert_not_nil "Yo".humanize, "humanize is returning nil."
  end
end

0

assert !!result 对我很有用。 !! 的意思是“转换为布尔值”(字面上的双重否定)。


-1

你可以使用

assert "Yo".humanize

在 Ruby 中,除了 nilfalse 以外的所有内容都是真实的。
更新:由于您想要明确检查非 nil:
refute_nil "Yo".humanize

但在您所描述的情况下,我实际上要检查返回值是否符合我的预期。请考虑:

class String
  def humanize
    false
  end
end

refute_nil "Yo".humanize
assert_equal "Yo", "Yo".humanize

好的,它会检查它是否返回了一些东西,而我想以另一种方式进行检查。 - Arslan Ali
当<anything>为nil时,"assert <anything>"不起作用 - 坦率地说,我感到很惊讶。我必须执行assert !!<anything>才能使其正常工作。 - Victor Pudeyev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接