使我的步骤定义更漂亮

时间:2014-09-23 20:37:05

标签: ruby cucumber

我正在编写一个步骤定义,它将采用http请求类型(get,post等),api的url以及从gherkin发送的数据表。我通过以下方式实现它,但它是一种非常强制性的风格,并不一定对其他测试人员清楚发生了什么。它构建来自像这样的表

的请求
| x | y |
| 1 | 2 |
| 5 | 7 |

这样使用JSON发送请求,在这种情况下发送两个请求,使用以下JSON:

{
  "x":"1"
  "y":"2"
}

{
  "x":"5"
  "y":"7"
}

换句话说,第一行之后的每一行代表一个具有第一行变量特定值的请求。

我的下面的实现,欢迎任何更可读的重构。感谢。

When(/^I submit the following (?:in)?valid data in a "(.*?)" request to "(.*?)"$/) do |request_type, api, table|
  data = table.raw
  for i in 1...data.length #rows
    body = {}
    for j in 0...data[0].length #cols
      body[data[0][j]] = data[i][j]
    end
    @response = HTTParty.__send__ request_type, "/a/url#{api}", { 
        :body => body.to_json,
        :headers => { 'Content-Type' => 'application/json' }
    }
  end
end

1 个答案:

答案 0 :(得分:0)

我会写这样的东西:

When(/^I submit the following (?:in)?valid data in a "(.*?)" request to "(.*?)"$/) do |method, api, table|
  data = table.raw
  keys = data.shift

  data.each do |line|
    hash = Hash[*keys.zip(line)]
    @response = build_request(api, method, hash)
  end
end

# with this helper method
def build_request(api, method, hash)
  HTTParty.__send__(method, 
                    "/a/url#{api}", 
                    { :body    => hash.to_json,
                      :headers => { 'Content-Type' => 'application/json' } })
end