I have a test for a controller that receives uploaded files, and I’ve gotten 
past a lot of obstacles, but I’ve got one that I just can’t understand. Using 
RSpec 2.12, Ruby 2.0.0, Rails 3.2.21.

Code from spec/controllers/auto_controller.rb:

…
describe AutoController do
  GoodEmails.each_with_index do | params, ix |
    before(:each) do
      Upload.delete_all
      Log.delete_all
      post :create, params
    end
    it "Valid posts for good email #{ix}" do
      response.code.should eq "201"
      Upload.count.should eq 1
      Log.count.should eq 1
      Log.last.message.should match(/Kobo Sales Upload/)
    end
  end
…


Some of the code from app/controllers/auto_controller.rb:

  def create
    begin
      for i in (1 .. params[:attachments].to_i)
        attachment = params["attachment#{i}"]
        if attachment.present? && attachment.original_filename.is_a?(String) && 
attachment.original_filename.split(".").last == 'zip'
          upload = Upload.create!(filename: attachment.original_filename, 
content: attachment.read, uploaded_at: Time.now, file_descr: params[:subject] )
          Log.log_message("Sales Upload #{upload.id} received 
(#{params[:subject]})", distributor_id: distributor_id, task: 'auto’, data: 
{params: clean(params)})
        end
      end
      render status: :created, nothing: true
    rescue StandardError
      render status: :created, nothing: true
      Log.log_message("Bad email received; subject: #{params[:subject]}", data: 
{params: clean(params)})
    end
  end

I’m getting the test rejected message:
Failure/Error: Upload.count.should eq 1
       
       expected: 1
            got: 0
       
       (compared using ==)


When I set a breakpoint at the end of the controller code, I see that 
response.code = 201, Upload.count = 1, Log.count = 1, and Log.last.message = 
"Kobo Sales Upload”

However, when I set a breakpoint in the spec file right inside the “it” block, 
I see response.code = 201, Upload.count = 0, and Log.count = 0.

My expectation was that the “before(:each)” would run before each test, so that 
I would see a break in the spec, then four breaks in the controller, then a 
break in the spec and four more breaks in the controller. Ideally, I would like 
to run the before code once, then perform the four tests on the result, and 
then iterate for the second GoodEmail. I think that I could accomplish that by 
using “before(:all)”, but apparently you cannot put a “post” command inside a 
before(:all) block, so I can’t do that.

So, I have two questions:
1) Why aren’t the database records still there when I get to the “it” block?
2) Is there a “more correct way ” (in terms of RSpec best practices) to 
structure this test sequence?

-- 
You received this message because you are subscribed to the Google Groups 
"rspec" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/rspec/F1CB2A4C-AB6B-4CC9-B0BB-380D3EC3DB5E%40pobox.com.

Reply via email to