测试 为什么同样的测试,不同的 action 就无法通过?

nightire · 2012年11月28日 · 最后由 nightire 回复于 2012年12月04日 · 3218 次阅读

一个非常简单的 controller, 就俩 action,如下:

class PostsController < ApplicationController
  def index
    @posts ||= Post.all

    respond_to do |format|
      format.html # index.html.haml
      format.json { render json: @posts }
    end
  end

  def show
    @post ||= Post.find(params[:id])

    respond_to do |format|
      format.html # show.html.haml
      format.json { render json: @post }
    end
  end
end

然后跑一个非常简单的测试,如下:

require 'spec_helper'

describe PostsController do
  describe "GET index" do
    it "should renders index view" do
      get :index
      response.should render_template "index"
    end
  end

  describe "GET show" do
    it "should renders show view" do
      get :show
      response.should render_template "show"
    end
  end
end

routes.rb也只有一个 resource,如下:

Blog::Application.routes.draw do
  resources :posts
end

结果呢,index 的测试通过,show 的测试就是不通过,显示错误是:ActionController::RoutingError: No route matches {:controller=>"posts", :action=>"show"}

想不通为什么?resources :posts不是已经映射了标准的 http verb 了吗?为什么 show 无法通过测试呢?

我还写了对应的 views,应用本地跑起来测试一下,index 和 show 都是正常的不会报错,真是奇了怪了!

show 不需要指定 id 么?

#1 楼 @chucai 你是说 rspec 里吗?见鬼的,rspec 的文档里给出的例子只有 index,show 我是模仿它写的,如果要指定 id 的话,怎么写呢?

show 这个 action 需要有参数,估计是没有传递参数的缘故吧

#3 楼 @woaigithub 我知道需要有参数,但是我不知道 rspec 里这样的测试该怎么传递参数给它?我甚至在前面尝试 mock 一个对象,或者设定 request.params["id"]……都没用,请教~

get :show, params

get :show, id: 123

顺带提一下:http://betterspecs.org/

#5 楼 @linjunpop Great!

describe "GET show" do
    it "should renders show view" do
      @post = create :post
      get :show, id: 1
      response.should render_template "show"
    end
  end

这样果然可以了!谢谢

总结一下:之前我一直以为是我 RSpec 没有写对,实际上我是不够了解get,虽然是用 RSpec 写测试,但get其实是 Rails 里的RequestHelpers.get方法,它可以接受三个参数:path, parameters, headers,并且返回一个 response 对象。同样的,其他 HTTP verb 也是如此。

还是对 Rails 的了解不够深入造成的啊!我觉得初学者肯定会有这样的疑惑:以为用 RSpec 写测试,里面就一定全是 RSpec 了,实际不然,测试当中我们也会经常用到 Rails(或其他 gems)里的方法,了解的越多,写测试就越加灵活和得心应手。

get :show, {:id => 10}

get(action, parameters = nil, session = nil, flash = nil)

#11 楼 @woaigithub 嗯嗯,我已经看过了,不过还是很谢谢你。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号