使用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端点的主要内容,如果未能解决你的问题,请参考以下文章

我可以使用RSpec测试已部署的站点吗?

使用 Sinatra 对端点进行版本控制

HTTP更改变量并重新加载Sinatra

Rspec: everyday-rspec实操。第7章使用请求测试-测试API

如何使用 rspec 测试 mandrill api

如何为需要用户身份验证的API构建Rspec请求测试