Rails 5 Test Prescriptions 第14章 Testing Exteranl Services(中斷。)

  • external testing strategy ✅
  • the service integration test✅
  • introduce VCR✅
  • Client Unit Tests ❌
  • Why an Adapter?
  • Testing for Error Cases
  • Smoke Tests and VCR Options 冒煙測試!🌿
  • The world is a Service

 使用test isolation 和 使用mock來限制測試的scope.能夠幫助你成功測試一個額外的服務,而且能夠斷網。web

External Testing Strategy
api

額外服務的測試故事包含2個主要角色:服務器

 

  • client:使用額外API的你的一部分程序代碼。既由於他須要經過API來存取數據,也由於他發送給某人使用的data給API。每一個案例,都會處理一個request和一個response
  • server:在你的應用程序以外,經過一些類型的網絡request能夠到達這個服務。(本章使用的一些策略在沒有斷網的時候也可使用) 
做者也介紹2個角色用於設計和測試目的:

 

  • a fake server: 在一個測試和返回一個回覆對象的期間,攔截HTTP request。使用VCR gem來關聯fake server
  • a adapter:是一個對象,用與client和server之間的調節。 

 

 


 

 

 

  1. Smoke test: 從client到真實服務器的完整的交互的測試。client->adapter->Fake server->Server (完整)
  2. integration test:從client->adapter->Fake Server的測試。也是完成的測試,但不是真實的測試,由於使用了stubbed response來代替真實server。 這裏會使用go-to 策略。
  3. Client Unit test: 從client到adapter結束。調節器的response是stubbed。調節器沒有真正使用fake server調用。這個好處就是:讓單元測試客戶端徹底和server API相隔離。
  4. a adapter unit test: 從adapter到Fake server。總體測試鏈條的中間。用於驗證 調節器從客戶端開始或者事件服務端的行爲。

 


 

The Service Integration Test 網絡

增長三個gemapp

gem 'twitter'  和twitter交互的。4千+🌟
gem 'vcr' , group: :test      用於請求測試。 4千+🌟 
gem 'webmock' , group: :test 用於模擬。2千+🌟工具

 

首先須要twitter API key和祕匙 。從它的程序管理頁面https://apps.twitter.com/, 生成本身的應用程序的keys單元測試

 

 

shared:

 

  api_key: 123
development:
  secret_key_base: 1fe3edb870eff077105cff3ed19f0bdf15a5f999ef09ba1043a4916
test:
  secret_key_base: 8baba343e347eadbfcbfa77afb3ba0b13b403fa2dcfb643edf18e44
  twitter_api_key: "FuiCOb9knp5USp6Si1rlAscHa"
  twitter_api_secret: "WYcZZdrPBteO4UCbjqFDfm8SakmeVILgO3tJ7SFADwqLjnPNsJ"
production:
  secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>

 

而後保存rake db:migrate

創建關聯:測試

task.rb是 belongs_to :user, optional: true  #不會進行關聯的存在驗證,能夠沒有關聯。ui

user.rb是:has_many :tasks, dependent: nullify   #刪除user,關聯的tasks的user_id設置爲空。  url

 

 

require "rails_helper"

 

RSpec.describe "task display" do
  let(:project) { create(:project, name: "Project Bluebook") }
  let(:user) { create(:user, twitter_handle: "noelrap") }
  let!(:task) { create(:task, project: project, user: user,
                              completed_at: 1.hour.ago, project_order: 1) }
  before(:example) do
    project.roles.create(user: user)
    sign_in(user)
  end
  it "shows a gravatar", :vcr do
    visit project_path(project)
    url = "http://pbs.twimg.com/profile_images/40008602/head_shot_bigger.jpg"
    within("#task_1") do
      expect(page).to have_selector(".completed", text: user.email)
      expect(page).to have_selector("img[src='#{url}']")
    end
  end
end 

 

 

 


 

 

Introducing VCR  (Fake server)

做者最喜歡的測試工具。concept is simple。當VCR生效時,會攔截第三方的HTTp request。默認設置,第一次請求正常經過,VCR會把response數據儲存下來。當測試再運行時,VCR攔截請求而後使用以前儲存的response數據,返回這個數據對象。 

個人理解:使用VCRgem讓第二次運行相同的集成測試無需再請求遠程的服務器了。就是虛假的服務器端的響應,在離線的時候天然可使用了。猜想,就是別人複查你的測試代碼後再運行一次,無需等待很長時間。

不過,但改變了一個測試,還得手動讓VCR重新記錄response。 能夠設置一個時間段,超出時間纔會再次改變response的記錄

 

VCR and RSpec 

讓任意一個it or describe塊來使用一個VCR cassette,須要本身配置。

spec/support/vcr.rb

VCR.configure do |c|
  c.cassette_library_dir = "spec/cassettes"
  c.hook_into :webmock
  c.configure_rspec_metadata!
  c.ignore_localhost = true
end

 

幾段解釋沒看...minit 和 cucumber略過

 

 


 

 

Client Unit Tests 

看不懂,暫聽。 

相關文章
相關標籤/搜索