Динамическая ошибка определения define_method в RSpec - PullRequest
4 голосов
/ 16 мая 2011

Я почти уверен, что здесь упущена основная ошибка, поэтому я надеюсь, что другой набор глаз может помочь. Я использую Rails 3, Ruby 1.9.2 и Rspec 2.

Я хотел бы определить методы динамического класса в модели, чтобы можно было возвращать базовые роли для назначаемого объекта (например, учетной записи) по мере их добавления в систему. Например:

BaseRole.creator_for_account

Все отлично работает через консоль:

ruby-1.9.2-p180 :003 > BaseRole.respond_to?(:creator_for_account)
 => true 

но когда я запускаю свои спецификации для любого из методов класса, я получаю NoMethodError везде, где я вызываю метод в спецификации. Я предполагаю, что что-то в том, как я динамически объявляю методы, не зависит от RSpec, но я не могу понять, почему.

lib dir - это путь к автозагрузке, и методы возвращают true для response_to?.

# /lib/assignable_base_role.rb
module AssignableBaseRole
  def self.included(base)
    base.extend(ClassMethods)
  end

  module ClassMethods
    BaseRole.all.each do |base_role|
      role_type = RoleType.find(base_role.role_type_id)
      assignable_name = base_role.assignable_type.downcase
      method = "#{role_type.name}_for_#{assignable_name}"

      define_method(method) do
        self.where(:role_type_id => role_type.id,
                :assignable_type => assignable_name).first
      end
    end 
  end
end

Затем включите модуль в BaseRole

# /models/base_role.rb
class BaseRole < ActiveRecord::Base
  include AssignableBaseRole

  belongs_to :role
  belongs_to :role_type

  ......
  ......

end

Тогда в моей спецификации:

  it "adds correct authority for creator role" do
    create_assignment 
    base_role = BaseRole.creator_for_account # <== NoMethodError here
    user1 = Factory.create(:user)
    account.users << user1
    user1.roles_for_assignable(account).should include(base_role.role)
  end

Ответы [ 2 ]

1 голос
/ 08 мая 2012

Был ли в вашем проекте другой класс или спецификации с тем же именем, но не добавлены динамические методы? У меня была та же проблема, что и у вас, и переименование одного из классов устранило ее.

Полагаю, сначала загружается другой класс

0 голосов
/ 17 мая 2011

Похоже, вы определяете эти методы на основе значений в базе данных:

BaseRole.all.each do |base_role|
.....

Может ли быть так, что "создатель" не существует в тестовой базе данных как тип роли или "учетная запись"не существует как assignable_type?

Предположительно, вы тестируете это в консоли для разработки, а не для тестирования, поэтому данные могут не соответствовать друг другу.Может потребоваться настроить данные в перед хуке.

...