2

私の Writer モデル クラスには、'posted_posts' または 'rejected_posts' 属性がありません。ただし、この SQL では:

posts = self.posts.select("sum(case when state = 'posted' then 1 else 0 end) as posted_posts, sum(case when state = 'rejected' then 1 else 0 end) as rejected_posts")

Writer インスタンスでこれらの「プロパティ」にアクセスできます。ただし、RSpec を使用する場合、このクエリを作成する必要はありませんが、代わりにメソッドを呼び出していると見なされるため、Writer インスタンスのこれらのプロパティを設定できません。

writer.rejected_posts = 8 

上記の行は、「undefined method 'rejected_posts'」という結果になります

これらのプロパティを「モック」するために、次のようにしました。

describe "performance_score" do
    it "should return a score based on the posted_posts and rejected_posts algorithm" do
      class Writer
        attr_accessor :posted_posts, :rejected_posts
      end
      writer = Factory(:writer)
      writer.rejected_posts = 8
      writer.posted_posts = 2
      writer.performance_score.should == 80
    end
  end

私の主な質問は、これらのメソッドがクラスにどのように追加されるかです。新しい Writer クラスを作成すると、ライター ファクトリと「同期」することをどのように認識しますか? このテスト用に新しい Writer クラスを作成していると思っていましたが、奇妙なことに、ライター ファクトリから他の属性にまだアクセスできます。これが理にかなっていることを願っています、ありがとう。

また、他の誰かがテストで同様のことをしたことがありますか?これは、この状況を処理するための最良の方法ですか? JavaScript の場合のように、存在しないプロパティを設定しようとして、それを作成するだけでよいと思います。

4

1 に答える 1

2

選択クエリから返されるものは、おそらく実際にはWriterモデルではありません。おそらくActiveRecord::Relationです。SQLステートメントで値を割り当てたメソッドを提供するために、おそらくmethod_missingARELによるある種の内部ハッシュ設定を実装してチェックしています。

テストのモックについては、あなたがしたことは確かに機能します。別のオプションは、を使用することstubです。

it "should return a score based on the posted_posts and rejected_posts algorithm" do
  writer = Factory(:writer)
  writer.stub(:rejected_posts => 8)
  writer.stub(:posted_posts => 2)
  writer.performance_score.should == 80
end
于 2012-11-28T21:52:42.963 に答える