2016-06-27 289 views
0

關注我有一個用於身份驗證以下控制器關注:RSpec的3.4測試控制器與response.body.read

module ValidateEventRequest 
    extend ActiveSupport::Concern 

    def event_request_verified?(request) 
    sha256 = OpenSSL::Digest::SHA256.new 
    secret = app_client_id 
    body = request.body.read 
    signature = OpenSSL::HMAC.hexdigest(sha256, secret, body) 
    ([signature] & [request.headers['X-Webhook-Signature'], request.headers['X-Api-Signature']]).present? 
    end 

    private 

    def app_client_id 
    ENV['APP_CLIENT_ID'] 
    end 
end 

到目前爲止,我有以下Rspec的測試設置,以達到此:

RSpec.describe ValidateEventRequest, type: :concern do 
    let!(:current_secret) { SecureRandom.hex } 

    describe '#event_request_verified?' do 
    it 'validates X-Webhook-Signature' do 
     # TBD 
    end 

    it 'validates X-Api-Signature' do 
     # TBD 
    end 
    end 
end 

我開始剔除這個請求,然後嘲笑和扼殺,現在我要摧毀我擁有的東西並尋求幫助。 100%的覆蓋率對我來說很重要,我正在尋找一些關於如何構建涵蓋這100%的測試的指針。

+0

所以看起來你學會了比從測試設置軌道以外的語言測試。在rspec中,您不需要以這種方式製作假貨。你可以做「RSpec.describe ValidateEventRequest,輸入::concern do」而不是創建一個假的。我不太瞭解如何測試問題,因爲Ruby社區中的許多人認爲他們是一個糟糕的想法(http://blog.coreyhaines.com/2012/12/why-i-dont-use-activesupportconcern.html,http ://mcdowall.info/the-great-satan-rails-concerns/)。這就是說,如果你像我提到的那樣重構你的測試,你應該能夠按照預期模擬和存根。 –

+0

我第一次嘗試這種方式,並且無法得到存根和嘲笑正常工作....嗯.. –

+0

如果您想更新您的問題與您的舊代碼,並讓我知道您的具體錯誤信息,我可以幫助你通過它。就我個人而言,我認爲你不需要擔心這個問題,我只會採取一個行動之前。 –

回答

0

這是我如何解決這個問題,我打開思路:

RSpec.describe ValidateApiRequest, type: :concern do 
    let!(:auth_secret) { ENV['APP_CLIENT_ID'] } 
    let!(:auth_sha256) { OpenSSL::Digest::SHA256.new } 
    let!(:auth_body) { 'TESTME' } 
    let(:object) { FakeController.new } 
    before(:each) do 
    allow(described_class).to receive(:secret).and_return(auth_secret) 
    class FakeController < ApplicationController 
     include ValidateApiRequest 
    end 
    end 

    after(:each) do 
    Object.send :remove_const, :FakeController 
    end 

    describe '#event_request_verified?' do 
    context 'X-Api-Signature' do 
     it 'pass' do 
     request = OpenStruct.new(headers: { 'X-Api-Signature' => OpenSSL::HMAC.hexdigest(auth_sha256, auth_secret, auth_body) }, raw_post: auth_body) 
     expect(object.event_request_verified?(request)).to be_truthy 
     end 

     it 'fail' do 
     request = OpenStruct.new(headers: { 'X-Api-Signature' => OpenSSL::HMAC.hexdigest(auth_sha256, 'not-the-same', auth_body) }, raw_post: auth_body) 
     expect(object.event_request_verified?(request)).to be_falsey 
     end 
    end 

    context 'X-Webhook-Signature' do 
     it 'pass' do 
     request = OpenStruct.new(headers: { 'X-Webhook-Signature' => OpenSSL::HMAC.hexdigest(auth_sha256, auth_secret, auth_body) }, raw_post: auth_body) 
     expect(object.event_request_verified?(request)).to be_truthy 
     end 

     it 'fail' do 
     request = OpenStruct.new(headers: { 'X-Webhook-Signature' => OpenSSL::HMAC.hexdigest(auth_sha256, 'not-the-same', auth_body) }, raw_post: auth_body) 
     expect(object.event_request_verified?(request)).to be_falsey 
     end 
    end 
    end 
end 
0

object_double是非常方便的測試關注:

require 'rails_helper' 

describe MyClass do 
    subject { object_double(Class.new).tap {|c| c.extend MyClass} } 

    it "extends the subject" do 
    expect(subject.respond_to?(:some_method_in_my_class)).to be true 
    # ... 

然後你就可以測試subject像任何其他類。當然你需要在測試方法時傳遞適當的參數,這可能意味着創建額外的模擬 - 在你的情況下是請求對象。

+0

我喜歡這裏要去的地方,你能否適應你的例子到我發佈的代碼中? –

+0

感謝您的幫助 –