I have scenario like this
Given /^initial data$/ do |table|
@schedule_05 = Factory.build :schedule_05
@schedule_05.save
puts "count of rows #{@schedule_05.cycles.count}" - # is 7
end
#....... there are same steps and where filling text fields and so on/
When /^i click a submit button "([^"]*)" in form$/ do |runs|
click_button(runs) # this is ajax request
end
Then /^count of SchOfWorkInformation is 365$/ do
puts "count of rows #{ScheduleOfWorking.count}" # is - 1
s_c = ScheduleOfWorking.find_by_schedule_code("05") # is too 1
puts "05 schedule is presents #{s_c.blank?}" # false
unless s_c.blank?
puts "05 schedule is presents #{s_c.date_of_countings.blank?}" #false
end
end
In step when i click submit involves a controller ScheduleOfWorkingController’s filling action
def filling
unless request.xhr?
@classifier_schedule = ScheduleOfWorking.classifiers_numbers
@schedule_number = ScheduleOfWorking.classifiers_numbers false
else
if params[:date_begin].blank? || params[:date_end].blank?
render :js => "alert('date fields is empty !')"
return
end
ScheduleOfWorking.fill_information_for(params[:date_begin].to_date,params[:date_end].to_date)
end
end
ScheduleOfWorking#fill_information_for
def self.fill_information_for(date_begin, date_end)
sch = all
sch.each do |e_sch|
e_sch.date_of_countings.each do |d_counting|
h_calculate = d_counting.roll_cycle(date_begin, date_end)
transaction do
SchOfWorkInformation.delete_all("(date >= '#{date_begin}' and date <= '#{date_end}') and schedule_code = #{d_counting.sch_code}")
SchOfWorkInformation.create! h_calculate
end
end
end
end
In SchOfWorkInformation i have custom validation method like this
def customer_validate
s = SchOfWorkInformation.where(:date => self.date, :schedule_code => self.schedule_code).first
if !s.blank? && (new_record? || s.id != self.id)
self.errors[:base] = "Запись не уникально!(date=#{self.date.to_s(:db)}, schedule_code=#{self.schedule_code})"
end
sch_number = schedule_code[0..1].blank? ? "0" : schedule_code[0..1]
session_number = schedule_code[2].blank? ? "0" : schedule_code[2]
logger.info "---------------------------------------"
ss_a = ScheduleOfWorking.all
s = ScheduleOfWorking.where("schedule_code='#{sch_number}'").
joins(:date_of_countings).
where("date_countings.session_number=#{session_number}")
# In Given section of my step i load the data, but s.balnk? gives true
if s.blank?
self.errors[:base] = "Schedule - #{sch_number} with session number #{session_number}), is not exists in DB"
end
end
Why my data lose in validation method? Help, please!
In development env. all rights, but in test not.
..sorry for long letter..
What database strategy are you using for these tests? If it’s running in a transaction, the data is never actually persisted to the database. You should be using some other method for these steps since the data is guaranteed to be persisted regardless of how many threads or processes are running. When you make an ajax request, it’s in a separate request to the server and the database transaction is only available to that request.
In my application, I have a setting for the javascript tests that uses a shared connection: