测试api控制器(主动模型序列化器)的最佳实践是什么?

时间:2016-01-28 20:47:19

标签: ruby-on-rails ruby testing rspec active-model-serializers

我正在开发一个应用程序,到目前为止,我一直在测试身份验证和请求响应代码等内容。但是测试有效载荷的结构似乎是个好主意。即。如果有嵌入资源或sidloaded资源。你们怎么测试这个。这是我正在做的一些测试的示例。我正在使用主动模型序列化器。但似乎有点像组织起来。

describe '#index' do
  it 'should return an array of email templates' do
    template = EmailTemplate.new(name: 'new email template')
    EmailTemplate.stub(:all).and_return([template])
    get :index
    payload = {:email_templates => [JSON.parse(response.body)["email_templates"][0].symbolize_keys]}
    template_as_json_payload = {:email_templates => [ActiveModel::SerializableResource.new(template).as_json[:email_template] ]}
    expect(payload).to eq(template_as_json_payload)
  end
end

2 个答案:

答案 0 :(得分:0)

我喜欢为JSON响应定义模式,并验证测试中看到的任何响应是否符合它。仅凭这一点并不能保证响应的值是正确的,但它确实告诉您响应的结构符合您的期望。

然后,这些模式成为客户端实现可以引用的API文档的一部分。通过在测试中使用模式,我更有信心API文档不会与实现不同步。进行模式更改以获得通过测试也是一个很好的提示,我可以考虑更改是否对现有API客户端是安全的,或者我是否需要发布新的API版本。

Thoughtbot的人们有一个使用rspec验证模式的好例子:https://robots.thoughtbot.com/validating-json-schemas-with-an-rspec-matcher

答案 1 :(得分:0)

这是一种方法:

body = JSON.parse(response.body)
assert_equal(body.keys, ["id", "author"])
assert_equal(body["author"].keys, ["id", "name"])

但你应该查看 Jonah 分享的链接,这是值得一读的。