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

How to deal with mocking nested resources in RSpec and Rails?

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

1
2
3
4
5
@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"

正在测试:

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

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


没有更好的方法来模拟它,但你应该注意到这是很多样板。原因是 user.reading_lists.find 违反了得墨忒耳定律。不管你是否认为得墨忒耳法则很重要,通过违反它来嘲笑它是痛苦的。

我建议要么使用真实模型,要么简化与模型的交互。如果没有看到您要指定的内容,我真的不能说如何。