Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Double收到意外消息,尽管存在存根_Ruby On Rails_Ruby_Rspec_Rspec Rails - Fatal编程技术网

Ruby on rails Double收到意外消息,尽管存在存根

Ruby on rails Double收到意外消息,尽管存在存根,ruby-on-rails,ruby,rspec,rspec-rails,Ruby On Rails,Ruby,Rspec,Rspec Rails,Double接收到意外消息尝试运行以下规范时报告失败/错误: MyKlass does something does something again (FAILED - 1) Failures: 1) MyKlass does something again Failure/Error: MyKlass.do_something Double "OtherKlass" received unexpected message :closed? with (n

Double接收到意外消息
尝试运行以下规范时报告失败/错误:

MyKlass
  does something
  does something again (FAILED - 1)

Failures:

  1) MyKlass does something again
     Failure/Error: MyKlass.do_something
       Double "OtherKlass" received unexpected message :closed? with (no args)
     # ./lib/my_klass.rb:5:in `do_something'
     # ./spec/my_klass_spec.rb:17:in `block (2 levels) in <top (required)>'

Finished in 2.05 seconds
2 examples, 1 failure

Failed examples:

rspec ./spec/my_klass_spec.rb:16 # MyKlass does something again
和code
lib/my_klass.rb

 1 require "spec_helper"
 2
 3 class OtherKlass; end
 4 
 5 describe MyKlass do
 6   let(:objekt) { double("OtherKlass", closed?: "NOT REALLY") }
 7 
 8   before :each do
 9     OtherKlass.stub(:get_objekt).and_return(objekt)
10   end
11 
12   it "does something" do
13     MyKlass.do_something
14   end
15 
16   it "does something again" do
17     MyKlass.do_something
18     MyKlass.do_something
19   end
20 end
1 class MyKlass
2   @@klass_var = nil
3 
4   def self.do_something
5     if @@klass_var.blank? || @@klass_var.closed?
6       @@klass_var ||= OtherKlass.get_objekt
7     end
8   end
9 end
我无法理解为什么
已关闭?
在我的规范文件的第6行被存根时被报告为意外消息


非常感谢您的帮助

在RSpec 3中,您可以使用
class\u double
,它允许您创建类的double。结合
as_stubbed_const
,您可以替换类的原始实现:

RSpec.describe MyKlass do
  let(:objekt) do
    double(OtherKlass, closed?: 'NOT REALLY')
  end

  before do
    class_double(OtherKlass, get_objekt: objekt).as_stubbed_const
  end

  it 'does something' do
    MyKlass.do_something
  end
end
在Rspec 2中,以下各项应起作用:

RSpec.describe MyKlass do
  let(:objekt) do
    double('OtherKlass', closed?: 'NOT REALLY')
  end

  before do
    fake_klass = Class.new
    fake_klass.stub(:get_objekt) { objekt }
    stub_const('OtherKlass', fake_klass)
  end

  it 'does something' do
    MyKlass.do_something
  end
end

在每次测试之前显式设置类变量可以解决问题:

before(:each) do
  MyKlass.class_variable_set :@@klass_var, nil
end

也许有人能找到更好的解决办法,但这个办法对我有效。

你看过吉姆的答案了吗?我认为你不能使用双对类方法——你使用的是哪个版本的rspec和ruby?Rails 4.1.6和rspec 2.14.1。不,它不起作用。报告了以下
NameError
未定义的局部变量或#
的方法“objekt”。抱歉,请再次检查,抱歉,仍然没有更改。获取与以前相同的错误消息:
Double“OtherKlass”收到意外消息:已关闭?使用(无参数)
。以下是帮助我的方法。在每次测试之前显式设置类变量可以解决问题:
在(:each){MyKlass.class\u variable\u set:@@klass\u var,nil}
之前。