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

时间:2014-08-08 13:28:47

标签: ruby json testing rspec

我正在开发一个从文件中读取JSON内容并使用它们来生成输出的应用程序。我正在使用RSpec进行测试,我的规格遍布JSON文字内容。有大量的重复,文件很大,难以阅读,并且它已经到了添加新案例如此痛苦的地步,它让我无法覆盖角落案件。

在我的规范中,是否有一个很好的策略可以重用大部分JSON?我想将JSON存储在spec文件中不存在的位置,因此我可以专注于规范中的测试逻辑,并且只需要了解我使用的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

1 个答案:

答案 0 :(得分:1)

我们遇到了同样的问题。我们通过创建以下帮助程序来解决它:

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 }

当然,你可以根据自己的喜好调整它。例如,我们存储了外部服务json响应,因此我们创建了get_service_response(service_name, request_name, response_type)帮助器。当我们使用get_service_response('cdl', 'reg_lookup', 'invalid_reg')

时,它现在更具可读性

假设您将json放入'create_data_input`