【问题标题】:How to deal with mocking nested resources in RSpec and Rails?如何处理 RSpec 和 Rails 中的模拟嵌套资源?
【发布时间】:2011-07-02 15:32:29
【问题描述】:

我有一个用户阅读列表的嵌套资源(一个用户 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

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

【问题讨论】:

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


    【解决方案1】:

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

    我建议要么使用真实模型,要么简化与模型的交互。在没有看到您要指定的内容的情况下,我真的无法说出如何。

    【讨论】:

    • 嗨,大卫,非常感谢您的回答。是的,我没有从得墨忒耳法则的角度考虑它,但你是绝对正确的。我要指定的位是第二个代码示例——我只想找到一个属于指定用户的 ReadingList(而不是执行 User.find)。无论如何,我认为你是对的 - 我将剪掉所有的存根并使用真实模型。干杯!
    • 考虑到这一点,我想我宁愿去user.find_reading_list。我可能会制作一个插件,将类似的方法添加到具有 AR 关联的模型中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-02
    • 2012-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多