ruby-on-rails - Rspec stub 操作变量

标签 ruby-on-rails ruby-on-rails-3 rspec rspec2 rspec-rails

假设我有这段代码

class SomeController < ApplicationController
  def some_methode
    some_var = some_value
    render text: some_var
  end
end

现在,在 Rspec 中我想用不同的值测试 Controller 。
如何将 some_other_value 分配给 some_var
我看了stub但它不起作用。我尝试过:

assign(:some_var, some_other_value )
controller.some_methode.stub(some_var: some_other_value )
some_methode.stub(some_var: some_other_value )
controller.some_methode.stub!(some_var: some_other_value )
controller.some_methode.stub(:some_var).and_return(some_other_value )

它们都不起作用。 some_var 不会更改为 some_other_value

最佳答案

如果您想测试 some_var 是否被分配了值 some_value,那么您可以使用 assigns (我注意到它不在您的列表):

it "assigns some_value to some_var" do
  get :some_method
  assigns(:some_var).should == some_value
end

但是,如果您想要做的实际上是覆盖some_value分配给some_var,那么我的建议是重新考虑(并且可能重构)您的 Controller 代码。我不相信这在 rspec 中是可能的,但即使是这样,我也不认为在这里做正确的事情。

如果值 some_value 会发生变化,那么最好为其创建一个 Controller 方法并 stub 该方法。

例如,在 Controller 代码中创建一个方法 get_value 并将 some_var 分配给该方法:

def some_method
  some_var = get_value
  render text: some_var
end

private

def get_value
  some_value
end

然后您可以在规范中 stub get_value:

it "does something when some_var is assigned value_to_test" do
  controller.stub(:get_value).and_return(value_to_test)
  get :some_method
  ... should ...
end

另一方面,如果 some_value 来自 params 哈希,那么您可以通过更改传入 HTTP 操作调用的内容来控制:

it "does something when passed value_to_test" do
  get :some_method, :some_var => value_to_test
  ... should ...
end

这会将 Controller 操作中的 params[:some_var] 设置为 value_to_test

有关此内容的更多信息,另请参阅 this discussion (有点旧但相关)。

关于ruby-on-rails - Rspec stub 操作变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12621455/

相关文章:

ruby-on-rails - Rails : Options for build bundler gemfile

ruby - 仅当所有元数据过滤器都与 RSpec 一起应用时才应用共享上下文

ruby-on-rails - 带有非 ActiveRecord 模型的 Rails ContactForm - 验证

ruby-on-rails - 设计创建用户并登录测试设置

ruby-on-rails - before_filter set_locale 除了 Controller

ruby-on-rails - 将图像上传到云服务的最简单解决方案

ruby - 配置思维 sphinx 和飞行 sphinx 时出错

ruby-on-rails - 如何使用 Rspec 测试 Controller - #show action

ruby-on-rails - 模型中未定义的任何实例

html - 使用下拉菜单创建菜单