Are these controller specs good enough?
I am new to testing controllers with RSpec. In my controller, I have these methods:
def edit
@widget = Widget.find(params[:id])
if @widget.present?
@all_widgets = Widget.where(:id != @widget.id).select("id, title")
wfs @widget.id
else
redirect_to widgets_url
end
end
and
def wfs widget_id
@all_features,
@existing_features,
@draft_features,
@imported_features = WidgetFeature.find_by_widget_id_group_by_status(widget_id)
end
I have tested the method WidgetFeature.find_by_widget_id_group_by_status(widget_id)
in the corresponding model.
Now, I don't know how to test the edit
method and what to test. I know all about stubs, mocks and doubles. I am following the Rails Test Prescriptions and the RSpec book.
So, I am familiar with the terminology and the basics, however I am confused when to mock or make a factory for the data.
Also, how do I test that the edit method actually calls the wfs method?
UPDATE:
These are some specs I have written, that give 100% coverage (tested by SimpleCov). Is this the best way to test the above methods. context " When #edit is called, it" do
it "assigns @all_widgets & other variables if widget for given widget_id is present" do
widget = Factory.create(:widget)
get :edit, :id => widget.id
assigns.each {|a| a.sho开发者_运维百科uld be_kind_of(Array)}
response.should be_success
response.should render_template("edit")
end
it "redirects_to widgets_url if widget for given widget_id is not present" do
widget = Widget.stub!(:find).with(12)
get :edit, :id => 12
response.should redirect_to(widgets_url)
response.should be_redirect
end
end
Comments are welcome on how to improve the above specs
You should mock WidgetFeature. In that way tests will be faster as it does not hit DB. And to check whether edit method is calling wfs method, you can use should_receive.
精彩评论