我是RSpec测试控制器的新手。在我的控制器中,我有这些方法:
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
和
def wfs widget_id
@all_features,
@existing_features,
@draft_features,
@imported_features = WidgetFeature.find_by_widget_id_group_by_status(widget_id)
end
我在相应的模型中测试了方法WidgetFeature.find_by_widget_id_group_by_status(widget_id)
。
现在,我不知道如何测试edit
方法以及测试内容。我知道关于存根,嘲笑和双打的所有内容。我正在关注 Rails测试处方和 RSpec书籍。
所以,我熟悉术语和基础知识,但是我很困惑何时模拟或制作数据工厂。
另外,如何测试 edit 方法实际调用 wfs 方法?
更新
这些是我编写的一些规范,它们提供100%的覆盖率(由SimpleCov测试)。这是测试上述方法的最佳方法。
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.should 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
欢迎评论如何改进上述规范
答案 0 :(得分:0)
你应该模仿WidgetFeature。这样,测试会更快,因为它没有击中DB。要检查编辑方法是否正在调用 wfs 方法,您可以使用should_receive。