如何编写测试以声明动作new
已呈现?
def method
...
render :action => :new
end
我正在寻找类似下面这些行的内容,但要声明该动作已被调用,而不是模板:
assert_equal layout, @response.layout
assert_equal format, @request.format
我知道我做不到@response.action
提前致谢!
德布
答案 0 :(得分:75)
对于未来发现这种情况的人来说,正确的方法是:
assert_template :new
答案 1 :(得分:9)
假设您有一个用于创建的控制器操作,如下所示:
def create
@post = Post.new(params[:post])
respond_to do |format|
if @post.save
format.html { redirect_to(@post, :notice => 'Post was successfully created.') }
format.xml { render :xml => @post, :status => :created, :location => @post }
else
format.html { render :action => "new" }
format.xml { render :xml => @post.errors, :status => :unprocessable_entity }
end
end
end
这是标准的Scaffold'帖子#new'view
<h1>New post</h1>
<% form_for(@post) do |f| %>
<%= f.error_messages %>
...... # just to show, it's bigger....
现在,如果成功创建了帖子,您希望被重定向,但如果失败,我们只想重新呈现新操作。下面的测试使用我们的主要人物DJTripleThreat所说的使用assert_template
。
test "should not create post and instead render new" do
post :create, :post => { }
assert_template :new
#added to doubly verify
assert_tag :tag => "h1", :child => /New post/
end
如果仍然没有漂浮你的船,我甚至会添加一个assert_tag以确保某些视图即将出现,所以你知道它会显示/呈现给最终用户。
希望这有帮助。
答案 2 :(得分:5)
从Rails 5.0.0开始,您可以通过测试显示的模板来测试操作是否正确呈现。
首先需要将rails-controller-testing
gem添加到Gemfile中(因为它是从版本5开始在Rails之外提取的)。然后,在您的测试中,只需使用:
assert_template :new
答案 3 :(得分:0)
视图将呈现,操作称为。 试试这个:
@controller.expects(:new)