使用RSpec测试Sinatra API端点
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用RSpec测试Sinatra API端点相关的知识,希望对你有一定的参考价值。
我有一个简单的Sinatra,其端点为“/ status”,它返回一个如下所示的JSON:
curl http://localhost
{"stats":{"hostname":"Home","cpu":null,"disk":null,"ram":null,"check_time":null}}
我试图在RSpec中编写测试来测试应用程序是否响应此端点以及端点是否以适当的格式返回正确的数据。端点如下所示:
class App < Sinatra::Base
@@stat = Stat.new
def self.stat
@@stat
end
get '/status' do
{ stats: @@stat.to_h }.to_json
end
end
Stat类看起来像这样:
class Stat
attr_accessor :hostname, :cpu, :disk, :ram, :check_time
@@stat = []
def initialize(attributes = {})
hostname = `hostname`.strip
@hostname = hostname
@cpu = attributes[:cpu]
@disk = attributes[:disk]
@ram = attributes[:ram]
@check_time = attributes[:check_time]
end
def to_h
{
hostname: hostname,
cpu: cpu,
disk: disk,
ram: ram,
check_time: check_time
}
end
end
当我做curl http://localhost
它返回这个:
{"stats":{"hostname":"Home","cpu":null,"disk":null,"ram":null,"check_time":null}}
我在测试中有一个问题,我希望这种格式,但得到其他东西:
describe "GET /status" do
let(:response) { get "/status" }
it "returns proper JSON" do
expect(response.body).to eq({"stats":{"hostname":"Home","cpu":null,"disk":null,"ram":null,"check_time":null}})
end
end
首先,它不喜欢null
(虽然curl
命令返回null
)。如果我把它改成nil
然后我得到这个:
expected: {:stats=>{:hostname=>"Home", :cpu=>nil, :disk=>nil, :ram=>nil, :check_time=>nil}}
got: "{"stats":{"hostname":"Home","cpu":null,"disk":null,"ram":null,"check_time":null}}"
当我做puts response.body
我得到这个:
{"stats":{"hostname":"Home","cpu":null,"disk":null,"ram":null,"check_time":null}}
我该如何解决?对不起,如果这个问题对某些人来说似乎不合适,但我仍然学会用RSpec进行测试。先感谢您
您对JSON响应和Ruby的哈希感到困惑。你的api返回json,在测试中你必须比较两个json字符串或两个哈希值。例如,要使用json进行比较,您可以执行以下操作:
expect(response.body).to eq({ stats: { hostname: "Home", cpu: nil, disk: nil, ram: nil, check_time: nil } }.to_json)
或者用哈希:
expect(JSON.parse(response.body)).to eq({ "stats" => { "hostname" => "Home", "cpu" => nil, "disk" => nil, "ram" => nil, "check_time" => nil } })
以上是关于使用RSpec测试Sinatra API端点的主要内容,如果未能解决你的问题,请参考以下文章