ruby - 减少 RSpec 中 JSON 测试输入的重复

标签 ruby json testing rspec

我正在开发一个从文件中读取 JSON 内容并使用它们生成输出的应用程序。我正在使用 RSpec 进行测试,我的规范到处都是 JSON 文字内容。有大量重复,文件很大且难以阅读,而且已经到了添加新案例非常痛苦的地步,这让我不愿涵盖角落案例。

在我的规范中重用大部分 JSON 是否有好的策略?我想将 JSON 存储在不在规范文件中的某个地方,这样我就可以专注于规范中的测试逻辑,并且只了解我使用的是哪个示例 JSON。

我知道如果测试很难写,我可能需要重构应用程序,但在我有时间这样做之前,我需要涵盖这些测试用例。

下面是应用程序的一个修改示例。我必须像这样加载许多不同的 JSON 格式的字符串,其中许多都相当大且更复杂:

RSpec.describe DataGenerator do      
  describe "#create_data" do     
    let(:input){
      '{ "schema": "TEST_SCHEMA",
         "tables": [
           { "name": "CASE_INFORMATION",
             "rows": 1,
             "columns": [
               { "name": "case_location_id", "type": "integer", "initial_value": "10000", "strategy": "next" },
               { "name": "id", "type": "integer", "delete_key": true, "initial_value": "10000", "strategy": "next" }
             ]
           }
         ]
       }'
    }
    it "generates the correct number of tables" do
      generator = DataGenerator.new(input)
      expect(generator.tables.size).to eq 1
    end
  end
end

最佳答案

我们有一个非常相同的问题。我们通过创建以下助手解决了这个问题:

module JsonHelper
  def get_json(name)
    File.read(Rails.root.join 'spec', 'fixtures', 'json', "#{name}.json")
  end
end

我们将所有 json 移动到 spec/fixtures/json 文件夹中的文件中。现在您将能够将其用作:

include JsonHelper

let(:input){ get_json :create_data_input }

当然,您可以根据自己的喜好/需要对其进行调整。例如,我们 stub 外部服务 json 响应,因此我们创建了 get_service_response(service_name, request_name, response_type) 帮助程序。当我们使用 get_service_response('cdl', 'reg_lookup', 'invalid_reg')

时,它现在更具可读性

假设您将 json 放入“create_data_input”

关于ruby - 减少 RSpec 中 JSON 测试输入的重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25204662/

相关文章:

ruby - 在 ruby 中杀死整个进程树

ruby - 如何为字符串编写就地方法

Ruby 范围/绑定(bind)

javascript - 无法使用点或方括号表示法来访问 json/javascript 对象中的键或数据,该对象在获取后保存到状态

json - 从空接口(interface)检索值

c# - 单击选择性粘贴时如何在 visual studio 2012 中显示 "paste Json class"?

ruby - 根据多个属性对结构进行排序

java - gradle 的奇怪 junit4 行为

java - 在测试中使用 Spring 上下文启动 Jetty

testing - Chai 的 Redux 测试问题