如何在RSpec和Rails中处理模拟嵌套资源?

时间:2011-07-02 15:32:29

标签: ruby-on-rails ruby-on-rails-3 mocking rspec

我有一个用户阅读列表的嵌套资源(一个用户has_many阅读列表)。我试图模仿我的控制器规格中的所有内容,但无法保持简洁。这是#show操作的前面代码:

@reading_lists = mock("Reading lists")
@reading_lists.stub!(:find).with("1").and_return(@reading_list)
@user = mock_model(User, :reading_lists => @reading_lists)
User.stub!(:find).with("1").and_return(@user)
get :show, :user_id => "1", :id => "1"

正在测试:

def show
  @user = User.find(params[:user_id])
  @reading_list = @user.reading_lists.find params[:id]
end

这似乎是一个疯狂的样板 - 是否有更好的方法来模拟它?

1 个答案:

答案 0 :(得分:4)

没有更好的方法来嘲笑它,但你应该注意到这是很多锅炉板。原因是user.reading_lists.find是Demeter违法定律。无论你是否认为德米特定律是重要的,通过违反它来嘲笑是痛苦的。

我建议使用真实模型或简化与模型的交互。如果没有看到你想要指明的内容,我真的无法说出来。