How do I test this?

I have this code in my controller which streams a file to the client. How on earth do I test this?

  #Stream the file to the client over HTTP   def preview       device_id=params[:device_id]

      path = @campaign.get_preview_url(device_id)

      #THE CONTENT TYPE IS REQUIRED!       ext=File.extname(file_name)

      if ext == ".3gp"           m_type="video/3gpp"       elsif ext == ".3g2"           m_type="video/3gpp2"       elsif ext ==".mp4"           m_type="video/mp4"       end

      send_file path, :disposition => 'inline', :type => m_type   end

[mailto:rubyonrails-talk@googlegroups.com] On Behalf Of eggie5

I have this code in my controller which streams a file to the client.

How on earth do I test this?

  #Stream the file to the client over HTTP   def preview       device_id=params[:device_id]

      path = @campaign.get_preview_url(device_id)

      #THE CONTENT TYPE IS REQUIRED!       ext=File.extname(file_name)

      if ext == ".3gp"           m_type="video/3gpp"       elsif ext == ".3g2"           m_type="video/3gpp2"       elsif ext ==".mp4"           m_type="video/mp4"       end

      send_file path, :disposition => 'inline', :type => m_type   end <

I'm too new to Ruby on Rails to be more specific, but the general way to handle things like this is to "mock out" the call to send_file. Then, send_file can be made to simply record how it was called, instead of actually sending a file across the wire. You then test that it was called correctly - without caring about what it actually does. The reason you don't care is that it's not your code. All you care about is that you called it with the right arguments at the right time.

///ark

Hye Eggie, what's that @campaign object contain?, if it's your server, then you have to just write one mock server,

and i am assuming this code is in some controller.,

  def test_preview_for_3gp       get :preview, :device_id => test_device # send what ever you want.       assert_response :success       assert_not_nil @response.headers["Content-Type"].index('video/ 3gpp') # write different set of Functional TestCases for your if/else ladder.

      expected_file_name = "/tmp/test.3gpp"       assert_equal expected_file_name, assigns(:path) # i just assumed the path variable can be made instance variable.

      assert_not_nil @response       assert_kind_of String, @response.body # i don't know what put in place of String here, if you do some google you may get some idea. Sorry, here   end

and one more thing is you can add some more assertions provided if you know what's the 3gp format, so if you want your FT's(Functional-Test- Cases) to cover even the content delivered, then you have to parse the 3gp file(or find any equivalent Ruby class, [i don't know any such class]) and write assertions for response.body to contain like header, tags etc. of 3gp format.

I guess it helps you, sorry if not.

Good Luck,