我有这些模特:
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字段
答案 0 :(得分:1)
在test_booking_page_success
之前尝试以下操作def test_url
assert_not_empty @user.setting.url
end
您可能正在传递一个空的'url'参数...如果显示的灯具已经完成且您没有从其他地方生成网址。
更新我能想象的唯一场景是:scott_settings中的booking_url设置为你的灯具中的'urlsegment'以外的东西。所以它返回nil资源的其他设置......