为什么我的Rails Minitest Polymorphic失败了?

时间:2015-02-13 01:29:11

标签: ruby-on-rails ruby tdd minitest

我有这些模特:

class User < ActiveRecord::Base
  has_one :setting, as: :resource, dependent: :destroy
  has_many :services
end

class Setting < ActiveRecord::Base
  belongs_to :resource, polymorphic: true
end

class Service < ActiveRecord::Base
  belongs_to :user
end

我从控制器获取此代码片段以访问它们,这在手动测试时有效(这是一个before_action方法):

before_action :setup

def get_vars
  @setting = Setting.find_by_booking_url @url
  @user = @setting.resource
  @services = @user.services
end

def setup
  @url = params[:url]
  @setting = Setting.find_by_url @url
  @user = @setting.resource
end

但在使用这些灯具进行自动化测试时:

# fixtures/users.yml
james:
  email: 'james@example.com'
  first_name: 'James'
  last_name: 'Soften'
  encrypted_password: <%= default_password_digest %>

# fixtures/settings.yml
scott_settings:
  resource: james (User)
  time_zone: 'Pacific Time (US & Canada)'
  url: 'urlsegment'

和这个控制器测试代码:

setup do
  @user = users(:james)
end
def test_booking_page_success
  get :new, url: @user.setting.url
  assert_response :success
end

失败并出现错误:

undefined method `services` for nil:NilClass

表示我无法访问“资源”以从设置对象获取用户。

我使用byebug检查变量(在运行测试的中间),而Setting对象(@ user.setting)有一个resource_id和resource_name,所以我想知道为什么我无法使用“资源”从Setting对象访问用户“运行测试时的属性。

有什么想法吗?

谢谢!

编辑:添加了更多控制器代码

编辑:在设置夹具中添加了URL字段

1 个答案:

答案 0 :(得分:1)

在test_booking_page_success

之前尝试以下操作
def test_url
 assert_not_empty @user.setting.url
end

您可能正在传递一个空的'url'参数...如果显示的灯具已经完成且您没有从其他地方生成网址。

更新我能想象的唯一场景是:scott_settings中的booking_url设置为你的灯具中的'urlsegment'以外的东西。所以它返回nil资源的其他设置......