Rspec с фабрикой и виртуальным атрибутом из модели не работает? - PullRequest
0 голосов
/ 06 марта 2011

Я использую Rspec и заводскую девушку, чтобы установить свои тесты.У меня есть фабрика пользователей, а затем я тестирую с помощью rspec.

В модуле с именем GameEngine :: Formulas у меня есть виртуальный атрибут (фактически hp - это уже модель, здесь он переопределяется):

def hp
    ((self[:hp] * 5) * (self.level + 1)) if self.first_class == 'Fighter'
    ((self[:hp] * 4) * (self.level + 1)) if self.first_class == 'Ranger'
    ((self[:hp] * 2) * (self.level + 1)) if self.first_class == 'Magician'
end 

Когда я удаляю этот виртуальный атрибут,тест работает нормально.Но если я оставлю это здесь, я получу это:

 Failure/Error: let(:user) { Factory(:user) }
 ActiveRecord::RecordInvalid:
   Validation failed: Hp can't be blank

ФАБРИКА:

Factory.define :user do |f|
    f.sequence(:username) { |n| "test#{n}" }
    f.password "1234567890"
    f.sequence(:email) { |n| "test#{n}@test.com" }
    f.first_class 'Ranger'
    f.hp 10000
    f.strength 100
    f.magic 100
    f.dexterity 100
    f.accuracy 10
    f.armor 20
    f.level 1
end

Почему это так?

Ответы [ 2 ]

2 голосов
/ 06 марта 2011

Проблема в исходном коде в том, что он возвращает nil за исключением случаев, когда first_class == 'Magician'. Оператор с конечным условным значением возвращает ноль, если условие ложно, например,

> 1 + 1 if true
# => 2

> 1 + 1 if false
# => nil

Все три теста выполняются для каждого вызова, поэтому результаты первых двух замаскированы последующим (и).

Вы можете переписать его с помощью регистра case:

  def hp
    case first_class
    when 'Fighter'
      ((self[:hp] * 5) * (level + 1))
    when 'Ranger'
      ((self[:hp] * 4) * (level + 1))
    when 'Magician'
      ((self[:hp] * 2) * (level + 1))
    end
  end
0 голосов
/ 06 марта 2011

Я решил эту проблему, изменив структуру if на if..elsif.

Я предполагаю, что явное возвращение значения, а затем наличие другого, если проверка испортила все. Не знаю точно, почему это так, но сработало, когда я это сделал.

...