【问题标题】:Best practice for testing private methods [closed]测试私有方法的最佳实践[关闭]
【发布时间】:2020-09-10 23:58:04
【问题描述】:
def _send(body_params)
   merge_body body_params
   response = self.class.post uri, request_options
   build_response response
end

private
   
def merge_body(params)
   request_options.merge!(body: params)
end

def headers
   { 'content-type' => 'application/json' }
end

def build_response(resp)
    {
       body: resp.body,
       response_code: resp.code.to_i
    }
end

def request_options
    @request_options ||= {
       headers: headers,
       query: query
    }
 end

def query
    { token: access_token }
end

在这个例子中,用 rspec 测试这个私有方法的最佳方法和实践是什么?确保所有标头、查询和 request_options 匹配

【问题讨论】:

  • 不要测试私有方法。仅测试公共接口,包括您的私有方法。
  • 您确定要将request_options 修改为merge!。应该是request_options.merge(body: params)

标签: ruby-on-rails ruby rspec


【解决方案1】:

有时需要测试私有方法建议进行重构。

根据access_token 的来源,headersqueryrequest_options 都可以是简单的访问器。

attr_reader :access_token, :headers, :query, :request_options

def initialize(access_token:)
  @access_token = access_token
  @headers = { 'content-type' => 'application/json' }
  @query = { token: access_token }
  @request_options = {
    headers: headers,
    query: query
  }
end

考虑build_responsemerge_body是否真的需要自己的方法。除非您在课堂上的其他地方需要这种逻辑,否则我认为这更容易理解。

def _send(params)
  resp = self.class.post(
    uri,
    request_options.merge(body: params)
  )

  return {
    body: resp.body,
    response_code: resp.code.to_i
  }
end

考虑是否需要将响应对象分解为 Hash;与原始响应对象相比,哈希以不太有用的形式提供的信息更少。

def _send(params)
  self.class.post(
    uri,
    request_options.merge(body: params)
  )
end

要进行测试,您可以使用 mock 来检查 post 是否接收到正确的 uri 和 request_options。

最后,您将检查 _send 的返回值是否包含预期的响应。

let(:uri) { ... }
let(:body_params) { ... }
let(:response) { ... }
let(:request_options) {
  {
    headers: { 'content-type' => 'application/json' }
    query: { token: access_token }
  }
}
let(:post_params) {
  request_options.merge(body_params)
}

it 'posts' do
  allow thing.class.to receive(:post)
    .with(uri, post_params)
    .and_return(response)

  expect( thing._send(body_params) ).to eq({
    body: response.body,
    response_code: response.code.to_i
  })
end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-29
    • 1970-01-01
    • 2018-05-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多