2016-10-21 6 views
0

У меня есть модельиспытания belongs_to включены концерном

class Survey < ActiveRecord::Base 
    include Respondable 
end 

в БД опросы таблица имеют следующие поля:

  • 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 

Я пытаюсь писать тесты для Respondable беспокойства, чтобы проверить его в изоляции, в соответствии с этим BlogPost https://semaphoreci.com/community/tutorials/testing-mixins-in-isolation-with-minitest-and-rspec

Вот мой 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 

ответ

2

I t Хинк если вы пишете

class DummySurvey < Survey 

вместо

class DummySurvey < ActiveRecord::Base 

вы должны быть золотыми. Когда вы определяете класс, наследующий от ActiveRecord::Base, есть ожидание того, что в вашей базе данных есть правильные таблицы и столбцы (настроенные через миграции и определяемые соглашениями об именах Rails).

Rails должен сбрасывать тестовую базу данных после запуска тестов, поэтому использование того же класса модели, что и ваше фактическое приложение, выполнимо.

0

Может быть какой-то способ, чтобы проверить его в изоляции будет:

describe Respondable do 
    class DummySurvey 
    attr_accessor :responses_saved_date, :responses_saved_by 
    def save 
     @saved = true 
    end 

    def persisted? 
     @saved 
    end 

    def self.belongs_to(association, options = {}) 
     @associations ||= {} 
     @associations[association] = OpenStruct.new(active_record: true, macro: :belongs_to, 
     options: options, foreign_key: options[:foreign_key] || "#{association}_id") 
    end 

    def self.reflect_on_association(association) 
     @associations ||= {} 
     @associations[association] 
    end 

    def self.column_names 
     ['responses_saved_by_type', 'responses_saved_by_id'] 
    end 

    include Respondable 
    end 

    subject { DummySurvey.new } 
    let(:user) { Object.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 
    subject.should be_persisted 
    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 
    subject.should be_persisted 
    end 
end 

В качестве альтернативы вы можете создать таблицу базы данных для класса DummySurvey в тестах или установить table_name из существующей таблицы:

class DummySurvey < ActiveRecord::Base 
    self.table_name = 'surveys' 
    include Respondable 
end 

 Смежные вопросы

  • Нет связанных вопросов^_^