【问题标题】:Is there a correct folder/file structure for request specs on rspec?rspec 上的请求规范是否有正确的文件夹/文件结构?
【发布时间】:2020-10-22 00:47:42
【问题描述】:

使用 RSpec(如果有所作为)

我习惯于编写控制器规范,并且知道在哪里放置每个测试很容易,因为我在 spec/controllers 中只有一个每个控制器的文件。我现在开始使用请求规范,虽然起初我认为使用相同的文件结构,但我现在读到请求规范可能包含对 same内的不同路由(指向不同控制器)的不同调用> 测试,现在我不知所措,找不到适合测试的文件结构。

假设我有一个创建资源 A (post /resource_A) 的测试,然后创建一个资源 B (post resource_B),然后在 GET /resource_A/previously_created_a_id 上检查我将创建的资源 B 作为关联资源,并且所有这些端点都转到不同的控制器,我应该把这个测试放在什么文件上?

我当然可以按照我认为合适的方式构建文件夹结构,但我喜欢约定优于配置,我在其他任何地方都找不到这个答案。

【问题讨论】:

    标签: ruby-on-rails rspec request integration-testing rspec-rails


    【解决方案1】:

    spec/requests 是默认值。 From the docs...

    请求规格由:type => :request 标记,或者如果您已设置config.infer_spec_type_from_file_location!,请将它们放在spec/requests 中。

    除此之外没有明确的指导。但按路线组织它们似乎是有道理的。

    假设我有一个创建资源 A(发布 /resource_A)的测试,然后创建一个资源 B(发布 resource_B),然后在 GET /resource_A/previously_created_a_id 上检查我将创建的资源 B 作为关联资源,所有这些端点都转到不同的控制器,我应该把这个测试放在哪个文件上?

    这是/resource_A/:id 显示其关联资源的测试。创建关联的 resource_B 是测试设置,除非有充分的理由,否则不应通过路由发生。这将作为 resource_B 的一部分进行测试。

    这里我假设您使用的是FactoryBot。如果你不是,你仍然不会通过调用路由来制作测试资源,而是使用模型或控制器。

    # spec/requests/resource_a_spec.rb
    Rspec.describe 'ResourceA management' do
      let(:resource_A) { create(:resource_a) }
    
      describe '/resource_A/:id' do
        context 'with a b' do
          let(:resource_B) { create(:resource_b) }
    
          before {
            resource_A.update!(b: resource_b)
          }
    
          it 'sees its associated resource' do
            get "/resource_A/#{resource_A.id}"
            ...
          end
        end
      end
    end
    

    随着您对路线的测试变得越来越大,您可能希望将它们拆分为单独的文件。取决于你在测试什么。例如,您可以通过行动来做到这一点。

    spec/
      requests/
        resource_a/
          show_spec.rb    # GET /resource_A/:id
          index_spec.rb   # GET /resource_A/
          create_spec.rb  # GET /resource_A/new and POST /resource_A
          edit_spec.rb    # GET /resource_A/:id/edit and PATCH /resource_A/:id
          destroy_spec.rb # DELETE /resource_A/:id
    

    【讨论】:

    • 感谢您的回复,我按照您的说法处理了这种规格,预先使用 FactoryBot 创建数据,让我感到困惑的是您分享的那个链接,他们有示例等等我知道他们建议在同一规范中使用和测试多个请求的东西
    • @DJA 这些是演示请求规范功能的示例,每个都控制整个文件;我不会将它们作为对更大规格结构的建议。从每个资源一个文件开始,然后如果它变得太大,则按照任何有意义的方式将其拆分。
    猜你喜欢
    • 1970-01-01
    • 2019-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-28
    • 1970-01-01
    • 1970-01-01
    • 2012-02-21
    相关资源
    最近更新 更多