ruby-on-rails - 关注包含的测试 belongs_to

标签 ruby-on-rails ruby testing rspec activesupport-concern

我有一个模型

class Survey < ActiveRecord::Base
  include Respondable
end

在 DB surveys 表中有下一个字段:

  • responses_saved_date
  • responses_saved_by_type
  • responses_saved_by_id

和模块

module Respondable
  extend ActiveSupport::Concern

  included do
    belongs_to :responses_saved_by,    :polymorphic => :true
  end

  def update_saved_settings!(person=nil)
    self.responses_saved_date = Time.now
    self.responses_saved_by   = person
    self.save
  end
end

根据这篇博文 https://semaphoreci.com/community/tutorials/testing-mixins-in-isolation-with-minitest-and-rspec,我尝试为 Respondable concern 编写单元测试,以隔离测试它

这是我的 rspec:

describe Respondable do
  class DummySurvey < ActiveRecord::Base
    include Respondable
  end

  subject { DummySurvey.new }

  it { should belong_to(:responses_saved_by) }

  it 'saves the settings with user' do
    subject.update_saved_settings!(user)

    subject.responses_saved_date.should_not be_nil
    subject.responses_saved_by.should eq user
  end

  it 'saves the settings without user' do
    subject.update_saved_settings!

    subject.responses_saved_date.should_not be_nil
    subject.responses_saved_by.should be_nil
  end
end

当我运行测试时,我收到下一个错误:

Failure/Error: subject { DummySurvey.new }
ActiveRecord::StatementInvalid:
    PG::UndefinedTable: ERROR:  relation "dummy_survey" does not exist
    LINE 5: WHERE a.attrelid = '"dummy_survey"'...
                                 ^
    : SELECT a.attname, format_type(a.atttypid, a.atttypmod),
                         pg_get_expr(d.adbin, d.adrelid), a.attnotnull, a.atttypid, a.atttypmod
                    FROM pg_attribute a LEFT JOIN pg_attrdef d
                      ON a.attrelid = d.adrelid AND a.attnum = d.adnum
                   WHERE a.attrelid = '"dummy_survey"'::regclass
                     AND a.attnum > 0 AND NOT a.attisdropped
                   ORDER BY a.attnum

最佳答案

我觉得如果你写

class DummySurvey < Survey

代替

class DummySurvey < ActiveRecord::Base

你应该是金色的。当您定义一个继承自 ActiveRecord::Base 的类时,期望您的数据库具有正确的表和列(通过迁移设置,并由 Rails 命名约定确定)。

Rails 应在测试运行后重置测试数据库,因此使用与实际应用相同的模型类是可行的。

关于ruby-on-rails - 关注包含的测试 belongs_to,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40177589/

相关文章:

ruby - 使用 em-websocket-client 向 websocket 服务器发送消息

java - 如何中断 Hibernate session ?

ruby-on-rails - 在 ruby​​ 中支持两种语法的问题

ruby-on-rails - 设计+主动管理员重定向

css - Ruby On Rails & Flaticon => 如何在 Rails 中导入(使用图标字体)Flaticon 图标?

ruby-on-rails - 如何使用 capistrano 处理一次性部署任务?

ruby - 使用 Shoryuken (ruby) 的 Amazon SQS 自定义重试延迟

android - Monkeyrunner 与仪器 - 功能测试哪个更好?

testing - 如何在单元测试中测试函数的输出 (stdout/stderr)

mysql - 如何通过在 Ruby Rails 平台上运行 sql 脚本来为 mysql 数据库做种?