1

我正在使用 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。

感谢您的时间,谢谢!

4

0 回答 0