6

私はオブジェクトを持っていますMyObject:

class MyObject

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

  def results
   []
  end
end

resultsの場合にのみメソッドをスタブしたいstat_to_load = "times"。どうやってやるの?私は試した:

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

しかし、それは機能しません。何か案が?

4

3 に答える 3

0

以下を試してみてください。これは期待どおりに機能するはずです。

ここでは、基本的に、実際new instanceに作成されたスタブとresults、返されたインスタンスのメソッドをスタブしています。

options = {:stat_to_load =>  "times"}
MyObject.stubs(:new).with(options)
                    .returns(MyObject.new(options).stubs(:results).return(["klala"]))
于 2014-08-19T11:12:57.963 に答える
0

したがって、テストしようとしているものをテストするためのより簡単な方法がおそらくあると思いますが、これ以上のコンテキストがなければ、何をお勧めするかわかりません. ただし、実行したいことを実行できることを示す概念実証コードを次に示します。

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

test
  special arguments
    bar
      should == bar
    opts
      should == {:foo=>"foo"}
  no special arguments
    bar
      should == []
    opts
      should == {:baz=>"baz"}

Finished in 0.01117 seconds
4 examples, 0 failures

ただし、ここでは特別な subject/let コンテキスト ブロックを多用しています。このテーマの詳細については、 http://benscheirman.com/2011/05/dry-up-your-rspec-files-with-subject-let-blocks/を参照してください。

于 2013-05-30T19:07:32.533 に答える