【问题标题】:Test class will not find instance variable getter测试类将找不到实例变量 getter
【发布时间】:2017-03-25 06:53:27
【问题描述】:

我是红宝石新手!当我运行我的测试脚本时,它会抛出一个异常:

NoMethodError: 未定义方法 `num=' for # 你的意思?数量

为什么找不到?谢谢!

这是我的课

class FizzBuzz
 def initialize(num = 0)
   @num = num
   @fb = 'FizzBuzz'
   post_init
end


 def post_init
  nil
 end

 def num
  @num
 end
 def fb
  @fb
 end

def num(value = 0)
@num = value
end

def fb(value = 0)
   @fb = value
 end

end

这是一个测试用例的例子

 def setup
      @obj = FizzBuzz.new()
 end

 #Test multiple of 3 results in instance attribute fb being set to Fizz
 def test_fb_three
     @obj.num = 42
     assert_equal  "Fizz", @obj.fb, "Incorrect value for fb.\nExpected\"Fizz\" got \"#{@obj.fb}\""
   end

这是堆栈跟踪:

NoMethodError: 未定义方法num=' for #<FizzBuzz:0x33b46a8 @num=0, @fb="FizzBuzz"> Did you mean? num C:/Users/frase/RubymineProjects/HW/test_hw4.rb:54:intest_fb_three' (评估):12:在run' C:/Program Files (x86)/JetBrains/RubyMine 2017.1/rb/testing/patch/testunit/test/unit/ui/teamcity/testrunner.rb:93:instart_mediator' C:/Program Files (x86)/JetBrains/RubyMine 2017.1/rb/testing/patch/testunit/test/unit/ui/teamcity/testrunner.rb:81:in `start'

编辑:添加测试用例示例,并清理

【问题讨论】:

  • def num(value = 0)改成def num=(value = 0)?
  • 这给了我一个语法错误,它说它需要一个表达式
  • 嘿史蒂文。你如何调用initialize 方法?你能发布确切的错误吗?请阅读“如何创建最小、完整且可验证的示例”stackoverflow.com/help/mcve。目前,任何人都无法验证您的问题并帮助您找到解决方案。
  • @JamesMilani 我已经清理了它,添加了堆栈跟踪和测试方法。这些信息足够你帮助我吗?

标签: ruby-on-rails ruby


【解决方案1】:

为什么找不到?

因为不是你写的。您为名为@9​​87654321@ 的方法编写了两个 方法定义。因为你不能有两个同名的方法,所以第二个定义会简单地覆盖第一个。

请看一下错误信息:它告诉你它正在寻找一个名为num=的方法。您的代码中没有这样的方法。

大概,您的意思是第二个num 方法被命名为num=。你需要重命名它:

def num=(value = 0)
  @num = value
end

请注意,带有默认值的可选参数在这里是无用的:无论如何,你不能调用没有参数的编写器方法,你必须始终只提供一个参数。 (忽略反射。)

【讨论】:

  • 你是对的!我猜根据我使用其他语言的经验,我认为它会重载它,而不是覆盖它。
  • 好吧,即使它 确实 重载它仍然无法工作,因为您正在调用的方法的名称是 num= 并且您是方法的名称定义是num。我不知道有什么语言可以用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-06
  • 1970-01-01
  • 1970-01-01
  • 2019-09-12
  • 1970-01-01
  • 2022-12-22
相关资源
最近更新 更多