【问题标题】:undefined local variable or method `params' for controller控制器的未定义局部变量或方法“参数”
【发布时间】:2018-11-19 12:00:54
【问题描述】:

我正在尝试使用 Rails 实现联系人管理器。我正在使用 RSpec 进行测试驱动开发。

“当我查看一个人的页面时,我点击一个添加链接,将我带到我输入电话号码的页面。我点击保存,然后我会看到这个人及其更新的信息”

我正在尝试验证此操作。

在我的控制器类中

describe "POST #create" do
context "with valid params" do
  let(:alice) { Person.create(first_name: 'Alice', last_name: 'Smith') }
  let(:valid_attributes) { {number: '555-1234', person_id: alice.id} }

  it "creates a new PhoneNumber" do
    expect {
      post :create, params: {phone_number: valid_attributes}, session: valid_session
    }.to change(PhoneNumber, :count).by(1)
  end

  it "redirects to the phone number's person" do
    post :create, params: {:phone_number => valid_attributes}, session: valid_session
    @phone_number = PhoneNumber.new(person_id: params[:person_id])
    expect(response).to redirect_to(@phone_number.person)
  end
end

我想重定向到电话号码的人,但在获取电话号码时 它给了我一个错误undefined local variable or method params' for #<RSpec::ExampleGroups::PhoneNumbersController::POSTCreate::WithValidParams:0x00007fc89e276898>

我也有如下视图测试

 it 'adds a new phone number' do
  page.click_link('Add phone number')
  page.fill_in('Number', with: '555-8888')
  page.click_button('Create Phone number')
  expect(current_path).to eq(person_path(person))
  expect(page).to have_content('555-8888')
end

现在这个测试也因为这个错误而失败:

expected: "/people/1"
got: "/phone_numbers"

如何解决这些问题并根据需要重定向用户?提前致谢

【问题讨论】:

  • 错误是关于它所说的,您在执行@phone_number = PhoneNumber.new(person_id: params[:person_id]) 语句的rspec 中既没有局部变量也没有方法。

标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-4


【解决方案1】:

您的测试中没有 params 这样的东西。

而不是...

@phone_number = PhoneNumber.new(person_id: params[:person_id])

...你可以这样做...

@phone_number = PhoneNumber.new(person_id: valid_attributes[:person_id])

但由于您只是在测试您是否重定向到该人,您可以完全删除上述行并执行

expect(response).to redirect_to(alice)

【讨论】:

  • 您好,谢谢您的回答。我尝试了您指出的代码,但是出现以下错误:Expected "http://test.host/people/1" to be ==="http://test.host/phone_numbers/1".
  • 这意味着您的控制器没有重定向到该人,而是重定向到电话号码记录。那样可以么?如果是这样,您需要将文本更改为 expect(response).to redirect_to(assigns(:phone_number)),这是您访问控制器实例变量的方式...测试中的 assigns(:phone_number) 与控制器中的 @phone_number 变量相同。
  • 如果不正常(即控制器应该重定向到人员记录),那么恭喜,您的测试在您的代码中发现了问题!
  • 谢谢,我明白了!
猜你喜欢
  • 2017-12-20
  • 1970-01-01
  • 2014-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-10
相关资源
最近更新 更多