【问题标题】:Why is my Rails Minitest Polymorphic Failing?为什么我的 Rails Minitest 多态失败?
【发布时间】: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


【解决方案1】:

在 test_booking_page_success 之前尝试以下操作

def test_url
 assert_not_empty @user.setting.url
end

您可能传递了一个空的“url”参数...如果显示的装置是完整的并且您没有从其他东西生成 url。

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

【讨论】:

  • 添加了这个测试。它通过了
  • 嗯,奇怪,用你的应用程序的结构创建了一个测试设置,但不能让它通过测试......你使用的是哪个版本的 Rails? (我在 4.2.0 上做过)
  • 做了一些研究...没什么,只是可以确认这段代码在自动和手动测试下都有效。我唯一不能检查的是@setting = Setting.find_by_booking_url @url,但如果你检查了byebug...
  • 我什至不能刹车来得到这个错误 - 没有用户 -> StandardError: No fixture named 'john' found for fixture set 'users' - 没有设置 -> NoMethodError: undefined method 'url' for nil:NilClass,没有服务 -> 测试通过...
  • 我能想象的唯一场景是:scott_settings 中的 booking_url 在你的灯具中设置为 'urlsegment' 以外的东西。所以它返回其他设置为零资源...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-20
  • 1970-01-01
相关资源
最近更新 更多