2012-12-05 1 views
0

Я пытаюсь изучить Rspec в очень простом CRUD Rails 3.2.8 приложении. Я следую общей схеме примеров Майкла Хартла и был умеренно успешным с огурцом для частичного снаружи. Теперь я хочу протестировать функцию Twilio SMS и, похоже, не могу попасть на первую базу, в основном потому, что я не задаю правильные вопросы, поэтому я ожидаю, что их исправят и вернусь на правильный путь. Мое приложение имеет две модели, товар и цену, и они взаимодействуют друг с другом в моих тестах на огурцы, поэтому он появляется. Я знаю, как в огурце, мне нужен объект, чтобы начать проверять его взаимодействия. В моем контроллере цен, я вижу, что я могу получить цены на сырье с ниже в моих ценах # создать метод:Rspec, FactoryGirl не удалось найти метод ActiveRecord

@price = @commodity.prices.build(params[:price]) 

я в конечном счете хочу, чтобы создать завод, который будет иметь много цен на данный товар. Но я хочу сначала основать. После примеров thoughtbot на их Readme я пытаюсь следующее рельсах консоли:

FactoryGirl.create(:commodity) do |price| 
    Commodity.prices.build(attributes_for(:price)) 
end 

Результат: NoMethodError: неопределенный метод `цены для # Хм, я не должен понимать либо RSpec или Factory Girl. Вот мой основной factories.rb:

FactoryGirl.define do 
    factory :commodity do 
    name "corn" 
    end 

    sequence :price do |n| 
    price 
    date { Time.now } 
    end 
end 

Вот мои две модели:

class Commodity < ActiveRecord::Base 
    attr_accessible :description, :name 
    has_many :prices 
end 

MOST_RECENT = 5 
class Price < ActiveRecord::Base 
    attr_accessible :buyer, :date, :price, :quality, :commodity_id 
    scope :most_recent, lambda { order("id desc").limit(MOST_RECENT) } 
    belongs_to :commodity 
end 

Моя попытка понять это, чтобы сделать это просто в Rails консоли, но ошибка также появляется, когда я бегу RSpec также. Но почему FactoryGirl или Rspec, похоже, не используют метод цен, который я получаю с Active Record? Ясно, что я что-то не понимаю, или я бы нашел ответ на Stack, thanx, sam

ответ

1

В вашем FactoryGirl.create есть пара проблем. Сначала аргумент блока должен быть commodity, а не price. create передает созданный объект в блок. Во-вторых, вы пытаетесь запустить prices в классе Commodity. В ваших объектных отношениях prices является аксессуаром, связанным с конкретным экземпляром. Существует не Commodity#prices метод, но любой данный экземпляр Commodity будет иметь prices. Вы, вероятно, можете использовать build, но я думаю, что канонический способ - использовать оператор сдвига, чтобы добавить Price.

Сведя вместе получает вас:

FactoryGirl.create(:commodity) do |commodity| 
    commodity.prices << FactoryGirl.create(:price, commodity: commodity) 
end 

Я не уверен, что вы делаете с sequence в вашем определении товарной фабрики. Если вы пытаетесь убедиться, что Commodities созданы с ценами по умолчанию (без добавления их, как указано выше), ознакомьтесь с некоторыми советами по адресу http://icelab.com.au/articles/factorygirl-and-has-many-associations/.

+0

Да, спасибо! Мне нужно шесть цен, чтобы проверить мою модель в модели и сделать их последовательными, чтобы помочь мне написать этот тест. – sam452