Аз съм нов в релсите и току-що започнах да пиша тестове, използвайки rspec версия: 2.11.1. Търся начин да заредя различни данни за различни тестове в моя клас. За това създадох статична функция в самия тест. В зависимост от изискванията създавам различен брой обекти. Имам функция seed_data, която инстанцира различен брой обекти въз основа на номера, който й се предава. Получавам това изключение:
NoMethodError: undefined method `seed_data' for #<RSpec::Core::ExampleGroup::Nested_1::Nested_5::Nested_1:0x007fcedd9bea70>
Моля, разгледайте примерния код по-долу:
require 'spec_helper'
require 'go_live_sale'
require 'rspec/expectations'
describe GoLiveSale do
context "get_go_live_sale_for_sale_ids Function Correctness" do
describe "Testing get_go_live_sale_for_sale_ids() function correctness " do
it "should return error when sale_ids is blank" do
result = GoLiveSale.get_go_live_sale_for_sale_ids({})
result[:err].should_not be_blank
result[:err].should == "err1"
end
it "should return all columns corresponding to select field for single go_live_sale" do
go_live_sales = seed_data(1)
sale_ids = go_live_sales.map{ |go_live_sale| go_live_sale.sale_id}
result = GoLiveSale.get_go_live_sale_for_sale_ids({:sale_ids => sale_ids})
result[:err].should be_blank
result[:go_live_sales].count.should_be == 1
delete_seed_data(go_live_sales)
end
it "should return all columns corresponding to select field for multiple go_live_sale" do
go_live_sales = seed_data(2)
sale_ids = go_live_sales.map{ |go_live_sale| go_live_sale.sale_id}
GoLiveSale.get_go_live_sale_for_sale_ids({:sale_ids => sale_ids})
result[:err].should be_blank
result[:message].should be_blank
result[:go_live_sales].count.should == 2
delete_seed_data(go_live_sales)
end
it "should return selected columns corresponding to select field for single go_live_sale" do
go_live_sales = seed_data(1)
sale_ids = go_live_sales.map{ |go_live_sale| go_live_sale.sale_id}
result = GoLiveSale.get_go_live_sale_for_sale_ids({:sale_ids => sale_ids, :columns => ["id","sale_id"]})
result[:err].should be_blank
result[:go_live_sales].count.should_be == 1
delete_seed_data(go_live_sales)
end
it "should return selected columns corresponding to select field for multiple go_live_sale" do
go_live_sales = seed_data(2)
sale_ids = go_live_sales.map{ |go_live_sale| go_live_sale.sale_id}
GoLiveSale.get_go_live_sale_for_sale_ids({:sale_ids => sale_ids, :columns => ["id","sale_id"]})
result[:err].should be_blank
result[:message].should be_blank
result[:go_live_sales].count.should == 2
delete_seed_data(go_live_sales)
end
it "should return error when selecting erroneous columns" do
go_live_sales = seed_data(2)
sale_ids = go_live_sales.map{ |go_live_sale| go_live_sale.sale_id}
GoLiveSale.get_go_live_sale_for_sale_ids({:sale_ids => sale_ids, :columns => ["id","random_sale_id"]})
result[:err].should_not be_blank
delete_seed_data(go_live_sales)
end
end
end
end
def self.delete_seed_data(go_live_sales)
go_live_sales.each do |go_live_sale|
go_live_sale.delete
end
end
def self.seed_data(number_of_go_live_sale_to_create)
go_live_sales =[]
(1..number_of_go_live_sale_to_create).each do |number|
go_live_sales.push(create_go_live_sale(number))
end
return go_live_sales
end
def self.create_go_live_sale(number_to_add)
go_live_sale = GoLiveSale.new
go_live_sale.start_date = Time.now
go_live_sale.sale_id = Sale.select("IFNULL(max(id),0)+#{number_to_add} as sale_id").first.try(:sale_id)
go_live_sale.sale_name = "Test Sale" + go_live_sale.sale_id.to_s
go_live_sale.sale_type = "Flash Sale"+ go_live_sale.sale_id.to_s
User.current_user = User.first
go_live_sale.save
return go_live_sale
end
RSpec::Matchers.define :be_valid do
match_for_should do |actual|
actual[:err].blank?
actual[:validation_error].blank?
actual[:is_valid] == true
end
match_for_should_not do |actual|
actual[:err].present?
actual[:validation_error].present?
actual[:is_valid] == false
end
failure_message_for_should do |actual|
"Expected validation to pass, but it failed"
end
failure_message_for_should_not do |actual|
"Expected validation to fail, but it passed"
end
end
Разбирам, че това е някакъв проблем с обхвата или може би rspec не ви позволява да пишете тестовете по този начин. Ще бъде страхотно, ако някой може да напише малък фрагмент от код, обясняващ как да се инстанцират тестови данни в такива случаи. Моята версия на rails е 3.0.5.