Rspec" NoMethodError"

时间:2016-05-18 18:51:14

标签: ruby unit-testing rspec nomethoderror

我是使用RSpec在Ruby中进行单元测试的新手,我在执行非常基本的单元测试时遇到了麻烦。我以前习惯使用Python和JavaScript进行单元测试,而且我通常不会遇到这个问题。

我只是尝试使用puts语句测试STDOUT。这是我的规格。

my_spec.rb

require 'my_file'

  describe C do
    before(:all) do
      @c = C.new
    end

    describe C do
      subject(:C) { described_class.new }
      it 'should print Hello World' do
        expect {@c.main}.to output("Hello world").to_stdout
      end
    end
  end

以下是my_file.rb

class C
    def main
        puts "Hello World"
    end
end

这里没有主要代码,只是对输出的简单测试,但我在运行规范时收到NoMethodError错误:

Failures:

  1) C C should print Hello World
     Failure/Error: expect {@c.main}.to output("Hello world").to_stdout

     NoMethodError:
       undefined method `main' for #<C:0x007fe54488a550>
     # ./spec/my_spec.rb:12:in `block (4 levels) in <top (required)>'
     # ./spec/my_spec.rb:12:in `block (3 levels) in <top (required)>'

它说我在main中定义了一个未定义的方法my_file.rb,我对这个错误知道的是它通常是因为我之前调用了一个方法& #39;定义。因为我认为这个方法是定义的,所以不确定我在这里做错了什么。任何帮助是极大的赞赏!

1 个答案:

答案 0 :(得分:1)

我可以想到两个可能的原因:

1)在运行时加载的my_file可能不是您认为的那个。我建议在其中放置一些内容,例如putsraise,以查看该文件是否真正在运行。

您可能希望使用require_relative而不是require,因为这样可以更好地控制加载哪个文件。

2)你有2 describe个。我建议删除内部的。

此外,spec文件中的1行有2个错误;这是更正后的版本:

    expect {@c.main}.to output("Hello World\n").to_stdout

'世界'没有大写,“Hello World”结尾没有“\ n”。