私の 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 の場合のように、存在しないプロパティを設定しようとして、それを作成するだけでよいと思います。