尝试在rspec中使用`instance_variable_set`时未定义的局部变量或方法错误

时间:2014-04-09 04:54:44

标签: ruby rspec

我有一个这样的课程

require 'net/http'
class Foo
  def initialize
    @error_count = 0
  end
  def run
    result = Net::HTTP.start("google.com")
    @error_count = 0 if result
  rescue
    @error_count += 1
  end
end

这是一个spec文件。

require_relative' foo'

describe Foo do
  let(:foo){ Foo.new}
  describe "#run" do
    context "when fails 30 times" do
      foo.instance_variable_set(:@error_count, 30)
    end
  end
end

然后运行rspec foo_spec.rb,然后失败并出现此错误。

foo_spec.rb:7:in `block (3 levels) in <top (required)>': undefined local variable or method `foo' for #<Class:0x007fc37410c400> (NameError)

如何在rspec中调用instance_variable_set方法?

修改

如果30次失败,我想调用send_error方法。

require 'net/http'
class Foo
  def initialize
    @error_count = 0
  end
  def run
    result = Net::HTTP.start("google.com")
    @error_count = 0 if result
  rescue
    @error_count += 1
    send_error if @error_count >= 30
  end
  def send_error
  end
end

用于测试连接失败30次时调用send_error的spec文件。

require_relative 'foo'

describe Foo do
  let(:foo){ Foo.new}
  describe "#run" do
    context "when fails 30 times" do
      it "should send error" do
        foo.instance_variable_set(:@error_count, 30)
        expect(foo).to receive(:send_error)
      end
    end
  end
end

1 个答案:

答案 0 :(得分:0)

我不知道你要做什么,但我怀疑这不是正确的做法。

但是,您当前的问题是您不在测试环境中,因此foo未定义。您希望将foo.instance_variable_set包装在测试构造中 - itspecify块,before :each或类似内容。