【发布时间】:2015-02-13 01:29:10
【问题描述】:
我有这些模型:
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
我有来自控制器的这段代码 sn-p 来访问它们,这在手动测试时有效(这是一个 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 检查了变量(在运行测试的中间),设置对象 (@user.setting) 有一个资源 ID 和资源名称,所以我想知道为什么我不能使用“资源”从设置对象访问用户" 运行测试时的属性。
有什么想法吗?
谢谢!
编辑:添加更多控制器代码
编辑:在设置装置中添加 URL 字段
【问题讨论】:
-
只是我还是
@user = @setting.resource没有意义?在get vars方法中..在手动测试期间可能不会因不同原因而失败? -
您能否更新控制器中设置
@url实例变量的部分? -
你的
scott_setting夹具会有问题吗?资源是简单的james。我想它应该是User模型的主键。简单的 SQL 告诉你什么? -
@EricPlaton no,正如文档所说的那样定义了夹具,实际上这里的所有代码都可以正常工作,我复制了应用程序寻找错误,它不在这里......
标签: ruby-on-rails ruby tdd minitest