0

ここでRails、RSpecの初心者の質問をお許しください。

RSpec を使用して、ファイルで作成したクラス内のメソッドをテストしようとしていますapp/workers/myworker.rb。このようなもの:

class MyWorker
   include SuckerPunch::Worker

   def perform(user_id)
     do_stuff(user_id)
     #etc
   end

   def do_stuff(user_id)
     # do stuff
   end
end

spec/workers/myworker_spec.rb次のような仕様ファイルがあります。

require 'spec_helper'

describe MyWorker do
  describe "do_stuff method" do
    test = do_stuff(3)
  end
end

私は得ていますundefined method 'do_stuff' for #<RSpec::Core::ExampleGroup::Nested_1::Nested_2:0x007fef211b7840>

MyWorkerRSpecでテストできるように、このクラスとそのメソッドを含める方法に関するヒントはありますか?

ありがとう。

4

3 に答える 3

2

あなたが与えたコードから、requireまたはrequire_relativeapp/workers/myworker.rbなく、「テスト」はexample groupにありません。

それらがそこにあるまで、あなたが抱えているかもしれない他の問題は議論の余地があります.


上記で使用したスタイルでは、暗黙の主語が得られます。

describe MyWorker do
  # subject { MyWorker.new } # this is not needed, and is kept in `subject`
  describe "do_stuff method" do
    it { should do_stuff(3) }  # but `subject` doesn't need to be used when it's implicit.
  end
end

ただし、それはまだ実際の仕様のようには見えません。おそらく次のようになるはずです。

describe MyWorker do
  let(:worker){ MyWorker.new }
  describe "do_stuff method" do
    subject { worker.do_stuff(3)}
    it { should_not be_nil }
    its(:total) { should == 12 }
  end
end

そんな感じ。ドキュメントこのブログ投稿でこれを参照してください。テストを例のグループに入れる必要があります。そうすると、subject(つまりworker、あなたの答えにある)無料で入手できます。

于 2013-04-23T01:04:33.433 に答える
1

わお。答えはばかげて明白でした。

app/workers/myworker.rbどういうわけか必須にする必要があると思っていましたが、実際の問題は単にクラスをインスタンス化していないことでした。

describe MyWorker do
  describe "do_stuff method" do
    worker = MyWorker.new
    test = worker.do_stuff(3)
  end
end

これは機能します。

于 2013-04-23T02:07:14.737 に答える
0

doあなたは、文字列で を間違えましたdescribe MyWorker:

require 'spec_helper'

describe MyWorker do
  describe "do_stuff method" do
    test = do_stuff(3)
  end
end
于 2013-04-23T01:15:10.673 に答える