【问题标题】:stubbing helpers using mocha使用 mocha 存根助手
【发布时间】:2011-08-29 21:49:48
【问题描述】:
it "should have edit button if user has permission to edit" do
  EntitiesHelper.stubs(:permission_to_edit_entity?).returns(true)
  get :index
  @entities[0..3].each do |entity|
    response.should have_selector("form",
      :method => "get",
      :action => "/entities/edit/#{entity[:id]}") do |form|
        form.should have_selector("input", :value => "Edit")
    end
  end
end

我正在尝试编写一个简单的测试用例,用于测试用户是否有权编辑时显示编辑按钮。我正在尝试为此使用存根。但是,它似乎不起作用。输出视图不会在每个实体旁边显示编辑按钮,如果存根工作,我会期望这些按钮。我是 mocha 和 stubbing 的新手 - 我在这里做错了什么?

谢谢!

【问题讨论】:

  • 我假设您在视图规范中执行此操作?因为如果它是你试图测试的控制器规范,这将永远无法工作 - 在这些情况下,rspec 会模拟视图
  • 即使我在顶部说“render_views”? (是的,我在控制器规范中这样做)
  • 如果这不能解决问题,我如何在视图规范中实现相同的效果?
  • Nvm - 通过废弃存根并在 spec_helper 中实现一些辅助方法以编程方式赋予用户不同的权限,使其工作。唯一的缺点是它使测试不那么独立于权限逻辑。
  • permission_to_edit_entity 吗? EntityHelper 上的类方法?我的预感是它可能是一个实例方法,当模块混入时可以访问。如果是这种情况,您必须在混入对象上存根该方法,或者找出另一种方法。除非 any_instance 能解决问题(我怀疑它会),否则听起来很乱。

标签: ruby-on-rails rspec mocha.js stubbing


【解决方案1】:

我假设EntitiesHelper 是一个普通的rails helper,它混合到控制器中 - 因此控制器可以使用它的所有实例方法(例如permission_to_edit_entity?),并且视图可以访问这些帮助器方法(通过控制器)...所以你可能会在控制器上存根方法:

controller.stubs(:permission_to_edit_entity?).returns(true)

在这种特殊情况下,我什至会考虑将存根更改为模拟,因为您希望调用该方法(尽管您正在测试按钮是否存在,但很高兴知道流程没有按预期发生):

controller.expects(:permission_to_edit_entity?).returns(true)

但这当然是有争议的,无论哪种方式你都应该没问题...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多