从rspec控制器规范中访问控制器实例变量

时间:2015-09-17 16:26:38

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

我不能在我的rspect测试中看到在控制器动作中创建的实例变量吗?

y1=wavread('E:\sound\one.wav');
y2=wavread('E:\sound\two.wav');
y3=wavread('E:\sound\three.wav');
y4=wavread('E:\sound\four.wav');

t=input('prompt:');
if t==1
    sound(y1,40000);
elseif t==2
    sound(y2,40000);   
elseif t==3
    sound(y3,40000);
elseif t==4
    sound(y4,40000);
else
    disp('wrong input');
end

-

# /app/controllers/widget_controller.rb
...
def show
  @widget = ...
  puts "in controller: #{@widget}"
end
...

这是我运行该规范时得到的输出:

# /spec/controllers/widget_controller_spec.rb
RSpec.describe WidgetController, type: :controller do
...
describe "GET #show" do
  it "assigns the requested widget as @widget" do
    get :show, { :id => 1 } # this is just an example - I'm not hardcoding the id

    puts "in spec: #{@widget}"
  end
end
...

我认为我应该在我的控制器规范中访问@widget是错误的吗?

3 个答案:

答案 0 :(得分:18)

使用Public Class Form1 Private Sub TextBox3_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TextBox3.KeyPress If Not Char.IsNumber(e.KeyChar) And Not e.KeyChar = Chr(Keys.Back) And Not e.KeyChar = Chr(Keys.Delete) Then e.Handled = True MessageBox.Show("numbers only", "baleted") End If End Sub End Class 方法:

assigns

当然,您可以根据需要检查it "assigns the @widget" expect(assigns(:widget)).not_to be_nil end ,但是如果没有看到您提供的控制器代码中的widget,我只是检查它是否为@widget

如果您想要nil小部件,就像在您的示例中一样,只需使用puts打印它

assigns

答案 1 :(得分:7)

在Rails 5中,assigns现已被拆分为新的rails-controller-testing宝石。

您可以安装gem继续使用assigns,也可以使用rails-controller-testing gem内部使用的内容,@controller.view_assigns[]

答案 2 :(得分:4)

assigns已过时。这是一种避免引入rails-controller-testing gem的解决方案

尽管可以code smell来测试控制器中的实例变量,但是要升级较旧的应用程序,您可以利用#instance_variable_get

Rspec示例: expect(@controller.instance_variable_get(:@people).first.id).to eq(person.id)