测试以检查属性是否分配失败

时间:2015-05-13 12:52:02

标签: ruby regex

我在exercism上尝试了一些练习。每个练习都附带一组我们需要通过的预先编写的测试。我目前正在努力的问题要求我们编写一个Robot类。每个机器人都应该有一个名为name的方法来设置默认名称。我是这样做的:

class Robot
  attr_accessor :name

  def self.name
    @name = DateTime.now.strftime("%y%^b%k%M%S")
    @name
  end
end

问题是第一次测试(我现在跳过其余的测试)一直没能失败。这是测试:

  def test_has_name
    # rubocop:disable Lint/AmbiguousRegexpLiteral
    assert_match /^[A-Z]{2}\d{3}$/, Robot.new.name
    # rubocop:enable Lint/AmbiguousRegexpLiteral
  end

我没有使用rubocop gem,所以我按原样留下了注释行。测试失败并出现此错误:

  1) Failure:
RobotTest#test_has_name [robot-name/robot_name_test.rb:7]:
Expected /^[A-Z]{2}\d{3}$/ to match nil.

我认为最大的问题是我不能真正理解错误,而且我不知道是否需要安装rubocop并取消注释上面的行或我的代码是完全错误的。对此有任何帮助将非常感激。

3 个答案:

答案 0 :(得分:1)

您的代码存在许多问题。

首先,您定义了访问者:name,但您没有initialize方法。

您定义的是一种类方法name,如果您拨打Robot.name,该方法就可以使用。

为了使您的课程有效,它应该如下所示:

class Robot

  def initialize
    @name = DateTime.now.strftime("%y%^b%k%M%S")
  end

end

Robot.new.name
#=> "15MAY150035"

或者你会做

class Robot

  def name
    DateTime.now.strftime("%y%^b%k%M%S")
  end

end

Robot.new.name
#=> "15MAY150649"

另外,在Ruby中,方法的最后一行已经是return编辑的,所以你不必在这里写@name

  def self.name
    @name = DateTime.now.strftime("%y%^b%k%M%S")
    @name # useless
  end

此外,变量@name在这里没用,因为方法name无论哪种方式都会返回DateTime个对象。

你必须确保你理解Ruby中的内容。

答案 1 :(得分:1)

您的代码将name定义为Robot 上的方法(这是self指示的内容;此处@name将是在类对象上设置成员变量)。您需要为每个实例提供一种名称。

作为次要问题,每次调用name时,您的方法都会更改名称。您可能想要设置一次(当机器人可能是initialize d时!),然后每次都返回。

答案 2 :(得分:1)

您的方法是一种类方法。这意味着Robot.name会为您提供名称,而Robot.new.namenil

您想使用:

def name
  #code
end

而不是self.name

您还可以在initialize方法中设置名称:

def initialize 
  @name = 'RB123'
end