Rails测试:断言渲染动作

deb*_*deb 20 testing ruby-on-rails

如何编写测试来断言操作new是否已呈现?

def method
  ...
  render :action => :new
end
Run Code Online (Sandbox Code Playgroud)

我正在寻找类似下面这些行的东西,但要声明操作被调用,而不是模板:

assert_equal layout, @response.layout
assert_equal format, @request.format
Run Code Online (Sandbox Code Playgroud)

我知道我做不到 @response.action

提前致谢!

德布

Moh*_*bid 77

对于未来找到这个的人来说,正确的方法是:

assert_template :new
Run Code Online (Sandbox Code Playgroud)


pja*_*mer 9

假设您有一个用于create的控制器操作,如下所示:

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
Run Code Online (Sandbox Code Playgroud)

这里是标准的Scaffold'帖子#new'视图

<h1>New post</h1>

<% form_for(@post) do |f| %>
<%= f.error_messages %>
...... # just to show, it's bigger....
Run Code Online (Sandbox Code Playgroud)

现在,如果成功创建了一个帖子,你想要被重定向,但是如果它失败了,我们只想重新呈现新的动作.下面的测试使用我们的主要人物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
Run Code Online (Sandbox Code Playgroud)

如果仍然没有漂浮你的船,我甚至会添加一个assert_tag以确保某些视图即将出现,因此您知道它会显示/呈现给最终用户.

希望这可以帮助.


ilo*_*acs 6

从Rails 5.0.0开始,您可以通过测试显示的模板来测试是否正确呈现了操作.

首先需要将rails-controller-testinggem 添加到Gemfile中(因为它是从版本5开始在Rails之外提取的).然后,在您的测试中,只需使用:

assert_template :new


Chr*_*yer 2

我原来的答案是错误的。正如@Mohammad El-Abid 下面指出的,正确的方法是:

assert_template :new
Run Code Online (Sandbox Code Playgroud)

原答案:

视图将被渲染,动作被调用。尝试这个: @controller.expects(:new)