Ruby Koan:test_nil_is_an_object

时间:2010-08-25 05:37:55

标签: ruby

我最近尝试使用此工具锐化我的导轨技能:

http://github.com/edgecase/ruby_koans

但我无法通过一些测试。此外,我不确定我是否正确地做了一些事情,因为目标只是通过测试,有很多方法可以通过它,我可能会做一些不符合标准的事情。

有没有办法确认我做得对吗?

一个具体的例子:

在about_nil,

 def test_nil_is_an_object
   assert_equal __, nil.is_a?(Object), "Unlike NULL in other languages"
 end

所以它告诉我检查第二个子句是否等于一个对象(所以我可以说nil是一个对象)或者只是放assert_equal true, nil.is_a?(Object)因为该语句是真的吗?

和下一个测试:

def test_you_dont_get_null_pointer_errors_when_calling_methods_on_nil
  # What happens when you call a method that doesn't exist.  The
  # following begin/rescue/end code block captures the exception and
  # make some assertions about it.
  begin
    nil.some_method_nil_doesnt_know_about
  rescue Exception => ex
    # What exception has been caught?
    assert_equal __, ex.class

    # What message was attached to the exception?
    # (HINT: replace __ with part of the error message.)
    assert_match(/__/, ex.message)
  end
end

我猜我应该在assert_match中放一个“No method error”字符串,但是assert_equal呢?

5 个答案:

答案 0 :(得分:10)

assert_equal true, nil.is_a?(Object)确实是正确的解决方案。问题是“在Ruby对象中是否存在nils?”,而在Ruby的情况下,它们是。因此,为了传递断言,你应该断言该测试的真实性。

在第二个示例中,当您在nil上调用未定义的方法时,您将获得NoMethodError: undefined method 'foo' for nil:NilClass。因此,异常类为NoMethodError,消息为undefined method 'foo' for nil:NilClass。在控制台中测试失败的行为,看看你从中获得了什么,然后将这些知识应用到测试中。

答案 1 :(得分:5)

你在跑吗

ruby path_to_enlightenment.rb

在更正每个测试后的命令提示符下?它会给你很多帮助。

另外“记住,沉默有时候是最好的答案” - 如果你难过,不要放任何东西,工具会帮助你。

答案 2 :(得分:2)

好吧,在使用Red-Green-Refactor的典型TDD座右铭时,你应该运行测试(可能在一个单独的控制台中使用rake)并看到失败发生。从那里,他们为您提供了一些关于预期内容的信息。

至于风格,公案并没有真正教导它。你应该找到并阅读一些用ruby编写的代码,以了解ruby社区的典型约定和习语。

答案 3 :(得分:2)

简单性是Ruby Koans的关键 - 当我开始它时,我认为必须比它更难,但事实并非如此!只要向IRB询问Koans问你的问题,经过几次你就会感觉到它。我写了一篇关于它的博客文章来帮助其他人:

Ruby Koans Answers

答案 4 :(得分:1)

我记得当我这样做的时候,我试图想出测试并尝试放入

<Answer> and <"Answer">

要记住的是,实际的类不必是字符串或其他东西。 所以答案是

ex.class, ex.class

如上所述,将代码放入irb并执行它。

(1..5).class == Range

是一个很大的暗示