rspec test case

I want test case in rspec for:
@drugs = Drug.where('drug_category_id = ?', params[:id])

Has anybody idea about it?

describe Drug
  it "should really be posted to the rSpec Google Group :)"
  it "would be helpful for you to read the Prag. Programmers rSpec book"

  it "find Drugs if they exist" do
    Drug.where('drug_category_id = ?', params[:id]).should have(1).record
  end
end

Steve Ross wrote in post #956143:

I want test case in rspec for:
@drugs = Drug.where('drug_category_id = ?', params[:id])

Assuming this line is in a controller action...

  it "find Drugs if they exist" do
    Drug.where('drug_category_id = ?', params[:id]).should
have(1).record
  end

The above is not how you want to write that spec.

Do something like this instead:

Robert Walker wrote in post #956169:

Steve Ross wrote in post #956143:

I want test case in rspec for:
@drugs = Drug.where('drug_category_id = ?', params[:id])

Assuming this line is in a controller action...

...then you shouldn't be writing RSpec specs for it at all. Use
Cucumber instead.

[...]

You don't need to hit the database just to make sure your controller is
assigning the @drugs instance variable. Use a mock instead.

It's usually easier and more reliable to use a factory. Yes, that hits
the DB. If you care that much, use an in-memory DB or something for
testing.

You don't
need to test the Rails "where()" method. Hopefully, that already has its
own tests in Rails. If it were broken, it doesn't do you any good to
prove it's broken in your application specs anyway.

Yup! Test your use of the framework. Don't test the framework itself.

Best,

Marnen Laibow-Koser wrote in post #956174:

Robert Walker wrote in post #956169:

Steve Ross wrote in post #956143:

I want test case in rspec for:
@drugs = Drug.where('drug_category_id = ?', params[:id])

Assuming this line is in a controller action...

...then you shouldn't be writing RSpec specs for it at all. Use
Cucumber instead.

Agreed, but the OP asked about RSpec, so I showed an RSpec example.

[...]

You don't need to hit the database just to make sure your controller is
assigning the @drugs instance variable. Use a mock instead.

It's usually easier and more reliable to use a factory. Yes, that hits
the DB. If you care that much, use an in-memory DB or something for
testing.

Agreed, but was attempting to show "pure" RSpec rather than RSpec plus
something else. Also, as you said using mocks can take more setup, but
they can also provide a performance boost for specs that don't actually
require hitting a database. I'll have to put some more thought in to
using an in-memory database for testing. That's intriguing.

Robert Walker wrote in post #956180:

Marnen Laibow-Koser wrote in post #956174:

Robert Walker wrote in post #956169:

Steve Ross wrote in post #956143:

I want test case in rspec for:
@drugs = Drug.where('drug_category_id = ?', params[:id])

Assuming this line is in a controller action...

...then you shouldn't be writing RSpec specs for it at all. Use
Cucumber instead.

Agreed, but the OP asked about RSpec, so I showed an RSpec example.

OK, fair enough.

[...]

Agreed, but was attempting to show "pure" RSpec rather than RSpec plus
something else. Also, as you said using mocks can take more setup,

Yeah, to the point where I think they're more trouble than they're
worth, and may actually be dangerous for AR models.

but
they can also provide a performance boost for specs that don't actually
require hitting a database. I'll have to put some more thought in to
using an in-memory database for testing. That's intriguing.

The idea is not original with me (I'm not such a performance weenie that
I'd think of that myself :slight_smile: ). SQLite can operate in in-memory mode,
which I think is where the idea came from.

Best,

My point is, although everyone on this thread has made excellent contributions, the question really belongs in the rSpec group. The OP's question was "I want a test case in rSpec for: @drugs = Drug.where('drug_category_id = ?', params[:id])" but doesn't specify what about that is to be tested. I don't know the OP, but suspect that the rSpec book would be a great introduction for designing tests that make sense and add robustness. My response was, admittedly, a bit tongue in cheek.

Robert Walker wrote in post #956169:

Steve Ross wrote in post #956143:

  it "find Drugs if they exist" do
    Drug.where('drug_category_id = ?', params[:id]).should
have(1).record
  end

The above is not how you want to write that spec.

Do something like this instead:
--------------------------
describe DrugsController do
  it "assigns the drugs within a given category as @drugs" do
    Drug.stub!(:where).with([ 'drug_category_id = ?', "37"
]).and_return([ mock_drug ])
    get :search, :id => "37"
    assigns[:drugs].should equal([ mock_drug ])
  end

  private
  def mock_drug(stubs={})
    @mock_drug ||= mock_model(Drug, stubs)
  end
end
--------------------------

The above code gives failure on:
get :search, :id => "37"
undefined method `abstract_class?' for Object:Class

Ishit Parikh wrote in post #956228:

Do something like this instead:
--------------------------
describe DrugsController do
  it "assigns the drugs within a given category as @drugs" do
    Drug.stub!(:where).with([ 'drug_category_id = ?', "37"
]).and_return([ mock_drug ])
    get :search, :id => "37"
    assigns[:drugs].should equal([ mock_drug ])
  end

  private
  def mock_drug(stubs={})
    @mock_drug ||= mock_model(Drug, stubs)
  end
end
--------------------------

The above code gives failure on:
get :search, :id => "37"
undefined method `abstract_class?' for Object:Class

Well, I didn't actually run that code. I just reworked a bit of working
code from one of my old projects. I'll leave it as an exercise for you
to figure out what I did wrong.

All right.
Thanx for the help...