我正在使用 Rails 6 和 JSON API Resource 创建一个 API,以便了解更多信息。我被请求测试卡住了。我现在正在做的是使用 gem json_matchers来测试我的端点的响应,但我真正的问题是构建请求的主体:发布、放置和修补。
您好,感谢您的关注。
这是交易,我开始将测试所需的所有 json 添加到我的 RSpec 文件中,但这些文件最终变得太大。所以我想,我怎样才能让它保持更瘦?
然后我将测试中的所有 json 复制到 json 文件中,并在需要时导入,例如:
# RSpec Helper
def request_json(json_name)
request_directory = "#{Dir.pwd}/spec/support/api/requests"
request_path = "#{request_directory}/#{json_name}.json"
File.read(request_path)
end
# Example of params for user request
let(:params) { request_json("user") }
我认为这是一个好主意,但后来我遇到了两个问题:我需要为每个请求测试创建一个文件以及......我将如何在运行时修改这个 json 文件的相同值?例如,我使用 FactoryBot 创建了一个对象,现在我需要在我的更新请求中使用该对象的 ID。我怎样才能做到这一点?
使用正则表达式?
let(:params) do
json = request_json("user")
json.gsub(/\"id\": \"1\"/, "\"id\": \"#{id}\"")
end
好的...它有效,但我不喜欢它!我认为这可能会变成一团糟。另一种选择是将其转换为哈希,然后再次转换为 json……不,不,不,也不喜欢它。
现在我正在尝试使用 FactoryBot 和 Faker 创建一些更动态的东西。现在,使用下面的代码,我可以传递一个工厂名称并接收一个完美的 json 正文。
def serializer_for(resource)
{
"data": {
"type": resource.to_s.tableize,
"attributes": create_attributes_for(resource),
}
}.to_json
end
def create_attributes_for(resource)
attributes = attributes_for(resource)
attributes.reduce({}) do |hash, element|
hash.update(standardize_json_key() => element.last.to_s)
end
end
def standardize_json_key(symbol)
symbol.to_s.gsub("_", "-")
end
但后来我开始思考这种方法的挑战:
- 发布/放置/修补关系?(has_one 或 has_many)
- 如何为 put/path 添加 ID 字段?
- 添加在需要时如何添加上传文件?
所以......回到我的问题:如何使用factory bot
(使用 even traits
)为请求准备 json 主体以及上述所有问题?
如果您有/知道这个问题的更好答案,请分享。如果没有,我会尝试为此创建一个 gem。
感谢您的时间,谢谢!