Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/59.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 如何仅在特定实例变量具有值时存根实例的方法?_Ruby On Rails_Ruby_Testing_Stub_Ruby Mocha - Fatal编程技术网

Ruby on rails 如何仅在特定实例变量具有值时存根实例的方法?

Ruby on rails 如何仅在特定实例变量具有值时存根实例的方法?,ruby-on-rails,ruby,testing,stub,ruby-mocha,Ruby On Rails,Ruby,Testing,Stub,Ruby Mocha,我有一个对象MyObject: class MyObject def initialize(options = {}) @stat_to_load = options[:stat_to_load] || 'test' end def results [] end end 仅当stat\u to\u load=“times”时,我才想存根results方法。我该怎么做?我试过: MyObject.any_instance.stubs(:initialize).w

我有一个对象
MyObject

class MyObject

  def initialize(options = {})
    @stat_to_load = options[:stat_to_load] || 'test'
  end

  def results
   []
  end
end
仅当
stat\u to\u load=“times”
时,我才想存根
results
方法。我该怎么做?我试过:

MyObject.any_instance.stubs(:initialize).with({
  :stat_to_load => "times"
}).stubs(:results).returns(["klala"])

但它不起作用。有什么想法吗?

所以,我认为可能有一种更简单的方法来测试您要测试的内容,但是如果没有更多的上下文,我不知道该推荐什么。但是,下面是一些概念验证代码,表明您想做的事情是可以做到的:

describe "test" do
  class TestClass
    attr_accessor :opts
    def initialize(opts={})
      @opts = opts
    end

    def bar
      []
    end
  end
  let!(:stubbed) do
    TestClass.new(args).tap{|obj| obj.stub(:bar).and_return("bar")}
  end
  let!(:unstubbed) { TestClass.new(args) }

  before :each do
    TestClass.stub(:new) do |args|
      case args
      when { :foo => "foo" }
        stubbed
      else
        unstubbed
      end
    end
  end

  subject { TestClass.new(args) }

  context "special arguments" do
    let(:args) { { :foo => "foo" } }
    its(:bar) { should eq "bar" }
    its(:opts) { should eq({ :foo => "foo" }) }
  end

  context "no special arguments" do
    let(:args) { { :baz => "baz" } }
    its(:bar) { should eq [] }
    its(:opts) { should eq({ :baz => "baz" }) }
  end

end


然而,我在这里大量使用了特殊主题/let上下文块。有关该主题的更多信息,请参阅。

请尝试下面的方法,该方法应按预期工作:

在这里,基本上我们实际上是存根
创建的新实例
,以及存根返回的实例的
结果
方法

options = {:stat_to_load =>  "times"}
MyObject.stubs(:new).with(options)
                    .returns(MyObject.new(options).stubs(:results).return(["klala"]))

您可以在测试中使用普通的旧Ruby来实现这一点

MyObject.class_eval do
  alias_method :original_results, :results
  define_method(:results?) do
    if stats_to_load == "times"
      ["klala"]
    else
      original_results
    end
  end
end

我可以看到问题中的
结果
结果
不匹配。可能不是你的答案,但值得修复?Oups,复制/粘贴错误我甚至不知道这是否可行,但可能正确的解决方案是注入对象或类,然后你对它有更多的控制。很难说/给出示例而不了解此代码是如何使用的。如果您有我的类MyObject,您将如何编写它。我想为rails测试创建存根。这个答案是针对RSpec而不是mocha的
MyObject.class_eval do
  alias_method :original_results, :results
  define_method(:results?) do
    if stats_to_load == "times"
      ["klala"]
    else
      original_results
    end
  end
end