Hey Xavier,

I'm well past most of the things you outlined. I do have to test the output 
because, as usual, the SQL Server adapter has to jump thru a few hoops to get 
things working and I want to black box test the final output of that behavior. 
Our parameterized SQL is a formatted string to a stored procedure called 
sp_executesql, details here. 
http://www.engineyard.com/blog/2011/sql-server-10xs-faster-with-rails-3-1/

Because SQL Server's show plan (explain) needs the unprepared statement, our 
implementation has to (1) method chain ActiveRecord::Explain#exec_explain to 
parse the unquoted first arg of the previous query now formatted with 
sp_executesql and (2) write a simple case inside our #exec_query that replaces 
the parameters with the binds when an EXPLAIN sql name is happening. All in all 
I am happy with our little hacks, but just wanted a nice way to test that we 
are generating an "explain" plan properly. 

I have tests for simple stuff that does not have binds, but wanted to write a 
test for something like `with_threshold(0) { Car.find(1) }` which does leverage 
a bind parameter but only logs to ActiveRecord's logger. So basically, I was 
looking for a nice way to do that which would make sure I was testing at a high 
level all the low level hacks.


 - Ken



On Dec 31, 2011, at 5:29 PM, Xavier Noria wrote:

> On Sat, Dec 31, 2011 at 10:59 PM, Ken Collins <[email protected]> wrote:
> 
>> I've been getting the SQL Server adapter up to passing for 3.2 and I wanted 
>> to test our explain printer. It will be very much like mysql2's printer. But 
>> I think my brain is mush and my meta-fu weak at the moment and I need some 
>> help. I tried stubbing ActiveRecord::Base.logger.warn but to no avail. Any 
>> thoughts?
> 
> Fantastic!
> 
> The high-level API is implemented in Active Record. You do not need to
> test via the logger, at the adapter level you only need to write
> #explain, which should return a string[*], and test that very return
> value. Just ensure the string itself is correct.
> 
> The caller code takes that string and does stuff with it, but that's
> handled above and it's tested in Active Record itself in an agnostic
> way.
> 
> For example, this is the implementation in the SQLite adapter:
> 
>    
> https://github.com/rails/rails/blob/master/activerecord/lib/active_record/connection_adapters/sqlite_adapter.rb#L219-236
> 
> and these are its tests:
> 
>    
> https://github.com/rails/rails/blob/master/activerecord/test/cases/adapters/sqlite3/explain_test.rb
> 
> Your adapter should do something like that.
> 
> Remember also to define a predicate #supports_explain? that returns true.
> 
> Hope that helps, please write again if more questions arise.
> 
> Xavier
> 
> [*] This string should ideally be a carbon copy of the one users are
> familiar with. I don't know if that makes sense for SQL Server, maybe
> they are used to some GUI output there?

-- 
You received this message because you are subscribed to the Google Groups "Ruby 
on Rails: Core" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/rubyonrails-core?hl=en.

Reply via email to