第7章使用請求測試-測試API . Rspec: everyday-rspec實操。

測試應用與非人類用戶的交互,涵蓋外部 API git

 

7.1request test  vs feature test github

 

RSpec 來講,這種專門針 對 API 的測試最好放在 spec/requests 目錄中,與前面編寫的功能測試分開。web

這種測試也不使用 Capy- bara,由於它模擬的是瀏覽器交互,而不是程序交互。json

咱們要使用的是前面測試控制器響應的 HTTP 動 詞:getpostdelete patch。 api

end-point:端點。 瀏覽器

 

7.2測試GET請求 ruby

 向API請求數據。session

請求測試與控制器測試不通的地方在於,可使用應用的任何路由。app

bin/rails g rspec:request projects_api post

create  spec/requests/projects_apis_spec.rb 

 

    it "loads a project" do
      user = FactoryGirl.create(:user)
      FactoryGirl.create(:project, name:"Sample Project")
      FactoryGirl.create(:project, name:"Second Sample Project", owner: user)
#發送HTTP GET請求, 爲了驗證身份, API 要求提供用戶的電子郵件地址和驗證令牌,所以咱們將其放到參數中 
      get api_projects_path, params:{
        user_email: user.email,
        user_token: user.authentication_token
      }
      expect(response).to have_http_status(:success)

#調試:看看response.body是什麼。一個array,包含了登錄用戶的projects的信息.

[{"id":2,"name":"Second Sample Project","description":"A test project.","due_on":"2018-05-26","created_at":"2018-05-19T07:30:14.169Z","updated_at":"2018-05-19T07:30:14.169Z","user_id":1}] 

      byebug  
      puts "---#{response.body}---"
      json = JSON.parse ( response.body)
      puts "---#{json}---" 
      byebug

#調試:轉化爲json ,: 變爲 =>

[{"id"=>2, "name"=>"Second Sample Project", "description"=>"A test project.", "due_on"=>"2018-05-26", "created_at"=>"2018-05-19T07:30:14.169Z", "updated_at"=>"2018-05-19T07:30:14.169Z", "user_id"=>1}] 

      expect(json.length).to eq 1
      project_id = json[0]["id"]
      puts "---#{project_id}---"
      byebug
# 指望json的數據是一條,以後獲取這個project的🆔。用於再次請求API,得到這個project的詳細信息。
      get api_project_path(project_id) , params:{
        user_email: user.email,
        user_token: user.authentication_token
      }
      expect(response).to have_http_status(:success)
      json = JSON.parse (response.body)
      expect(json['name']).to eq "Second Sample Project"

#最後,解析第二次請求返回的JSON數據。看看是否match. 

    end

 

JSON.parse()方法 

通常從web上response的數據格式是string,這個數據又是用JSON模式寫的,則可使用parse(). 

Parsse the data with JSON.parse(), and the adta becomes a JavaScript object. 

 

7.3 測試POST 請求 

向API發送POST請求。

    it "creates a project" do
      user = FactoryGirl.create(:user)
      project_attributes = FactoryGirl.attributes_for(:project)
      puts "~~~#{project_attributes}~~~"
      byebug
#獲得一個成功建立項目的屬性散列

{:name=>"Project 1", :description=>"A test project.", :due_on=>Sat, 26 May 2018 08:22:01 UTC +00:00} 

#向API發送POST請求。須要傳遞身份驗證,項目相關屬性。

      expect{
        post api_projects_path , params:{
          user_email: user.email,
          user_token: user.authentication_token,
          project: project_attributes
        }
      }.to change(user.projects, :count).by(1)
# response:#<ActionDispatch::TestResponse:0x00007fadc95a6990>

# response.body: {"status":"created"}

# response.header: 

 

# {"X-Frame-Options"=>"SAMEORIGIN", "X-XSS-Protection"=>"1; mode=block", "X-Content-Type-Options"=>"nosniff", "Content-Type"=>"application/json; charset=utf-8", "ETag"=>"W/\"5c15461069e69109955c72671ffc465d\"", "Cache-Control"=>"max-age=0, private, must-revalidate", "Set-Cookie"=>"_projects_session=V056Ym11dkpTMzI3Qnl1ell4MVJCY3NacWZTNUIyMEFPd1p3dENyTzBHT05nek1OcTBZeFhzVHMyUWY0aUtjaytJaVBVSGVkdGl5THNGcGEzTVcrcDhJNDNUMEN4c0JwVml1a2dibU1XeUFoVVZHSnRjRzExUUh4TGp3aUxxdWwvaVFvVGtjK3RkRHdIVTdiZXVCTGRnPT0tLTZOY0hWOWwvOHY0aDJnb0t5amtCYVE9PQ%3D%3D--a5331d1bfca86dd6979192edece7a50a4d2cf6c5; path=/; HttpOnly", "X-Request-Id"=>"2629be13-6804-4c45-b88a-0051b4be16ae", "X-Runtime"=>"0.012613", "Content-Length"=>"20"}
      expect(response).to have_http_status(200)
    end
  end

 

 

7.4 把控制器測試替換爲請求測試

 

要點:把控制器測試中的HTTP VERB 後的:create等方法改成相對路徑

post :create改成post projects_path

 

另外:

 

API 的控制器不一樣,這些控制器動做使用標準的電子郵件和密碼驗證身份 

1.建立spec/support/request_spec_helper.rb,
module RequestSpecHelper

2.而後,在spec/rails_helper.rb文件中讓Devise把輔助方法應用到請求測試中。

RSpec.configure do |config|

... 

  config.include Devise::Test::ControllerHelpers, type: :controller

  config.include RequestSpecHelper, type: :request

end 

 

7.5 小結

 redirect_to 能夠用在請求測試,

 have_http_status 能夠用在feature,request 人, controller測試。

具體見https://www.rubydoc.info/gems/rspec-rails/frames#redirect_to 

相關文章
相關標籤/搜索