test multiple urls in nested shared examples rspec










0















So I am setting up rspec on a non tested codebase. I am starting with endpoint testing. I am relying a lot on shared example to DRY. My setup worked well like follow : (simplified for readability)



describe Api::V2::EventsController, type: :api do
let(:type) 'events'
let(:instance_trait) :with_events
let(:record_count_transiant) :events_count

subject controller
it_behaves_like 'index'
end


RSpec.shared_examples 'index' do
context 'index without data' do
it_behaves_like 'empty_index'
end
end

RSpec.shared_examples 'empty_index' do
let(:instance) create :instance

before do
get "/api/v2/#instance.slug/#type"
end

it 'responds with success status' do
expect(last_response.status).to eq 200
end
end


But today I tried to test the nested indexes. My issue is that the urls to tests are multiplied for the shared_examples so I can't use the same logic of doing the request in the before because last_response will be the last response (yes).



My first try was to loop through the urls in the it block like follow :



it 'responds with success status' do
parent_types.each do |parent_type|
get "/api/v2/#instance.slug/#parent_type/#instance.send(parent_type).first.uuid/#type"

expect(last_response.status).to eq 200
end
end


which does not work because the request is apparently not over when the expect is ran.



So my second try was to loop in the parent shared example and pass url as a variable :



RSpec.shared_examples 'nested_index' do
context 'index without data' do
it 'is nested in shows' do
parent_types.each do |parent_type, parent_config|
instance = create :instance, parent_config[:trait]

url = "/api/v2/#instance.slug/#parent_type/#instance.send(parent_type).first.uuid/#type"
it_behaves_like 'empty_nested_index', url
end
end
end
end


but I get the error : it_behaves_like is not available from within an example. (e.g. an it block)



And I can't access the let variable if I'm not in an it block so I'm kind of stuck. Any tip on restructuring my tests would be appreciated.










share|improve this question




























    0















    So I am setting up rspec on a non tested codebase. I am starting with endpoint testing. I am relying a lot on shared example to DRY. My setup worked well like follow : (simplified for readability)



    describe Api::V2::EventsController, type: :api do
    let(:type) 'events'
    let(:instance_trait) :with_events
    let(:record_count_transiant) :events_count

    subject controller
    it_behaves_like 'index'
    end


    RSpec.shared_examples 'index' do
    context 'index without data' do
    it_behaves_like 'empty_index'
    end
    end

    RSpec.shared_examples 'empty_index' do
    let(:instance) create :instance

    before do
    get "/api/v2/#instance.slug/#type"
    end

    it 'responds with success status' do
    expect(last_response.status).to eq 200
    end
    end


    But today I tried to test the nested indexes. My issue is that the urls to tests are multiplied for the shared_examples so I can't use the same logic of doing the request in the before because last_response will be the last response (yes).



    My first try was to loop through the urls in the it block like follow :



    it 'responds with success status' do
    parent_types.each do |parent_type|
    get "/api/v2/#instance.slug/#parent_type/#instance.send(parent_type).first.uuid/#type"

    expect(last_response.status).to eq 200
    end
    end


    which does not work because the request is apparently not over when the expect is ran.



    So my second try was to loop in the parent shared example and pass url as a variable :



    RSpec.shared_examples 'nested_index' do
    context 'index without data' do
    it 'is nested in shows' do
    parent_types.each do |parent_type, parent_config|
    instance = create :instance, parent_config[:trait]

    url = "/api/v2/#instance.slug/#parent_type/#instance.send(parent_type).first.uuid/#type"
    it_behaves_like 'empty_nested_index', url
    end
    end
    end
    end


    but I get the error : it_behaves_like is not available from within an example. (e.g. an it block)



    And I can't access the let variable if I'm not in an it block so I'm kind of stuck. Any tip on restructuring my tests would be appreciated.










    share|improve this question


























      0












      0








      0


      1






      So I am setting up rspec on a non tested codebase. I am starting with endpoint testing. I am relying a lot on shared example to DRY. My setup worked well like follow : (simplified for readability)



      describe Api::V2::EventsController, type: :api do
      let(:type) 'events'
      let(:instance_trait) :with_events
      let(:record_count_transiant) :events_count

      subject controller
      it_behaves_like 'index'
      end


      RSpec.shared_examples 'index' do
      context 'index without data' do
      it_behaves_like 'empty_index'
      end
      end

      RSpec.shared_examples 'empty_index' do
      let(:instance) create :instance

      before do
      get "/api/v2/#instance.slug/#type"
      end

      it 'responds with success status' do
      expect(last_response.status).to eq 200
      end
      end


      But today I tried to test the nested indexes. My issue is that the urls to tests are multiplied for the shared_examples so I can't use the same logic of doing the request in the before because last_response will be the last response (yes).



      My first try was to loop through the urls in the it block like follow :



      it 'responds with success status' do
      parent_types.each do |parent_type|
      get "/api/v2/#instance.slug/#parent_type/#instance.send(parent_type).first.uuid/#type"

      expect(last_response.status).to eq 200
      end
      end


      which does not work because the request is apparently not over when the expect is ran.



      So my second try was to loop in the parent shared example and pass url as a variable :



      RSpec.shared_examples 'nested_index' do
      context 'index without data' do
      it 'is nested in shows' do
      parent_types.each do |parent_type, parent_config|
      instance = create :instance, parent_config[:trait]

      url = "/api/v2/#instance.slug/#parent_type/#instance.send(parent_type).first.uuid/#type"
      it_behaves_like 'empty_nested_index', url
      end
      end
      end
      end


      but I get the error : it_behaves_like is not available from within an example. (e.g. an it block)



      And I can't access the let variable if I'm not in an it block so I'm kind of stuck. Any tip on restructuring my tests would be appreciated.










      share|improve this question
















      So I am setting up rspec on a non tested codebase. I am starting with endpoint testing. I am relying a lot on shared example to DRY. My setup worked well like follow : (simplified for readability)



      describe Api::V2::EventsController, type: :api do
      let(:type) 'events'
      let(:instance_trait) :with_events
      let(:record_count_transiant) :events_count

      subject controller
      it_behaves_like 'index'
      end


      RSpec.shared_examples 'index' do
      context 'index without data' do
      it_behaves_like 'empty_index'
      end
      end

      RSpec.shared_examples 'empty_index' do
      let(:instance) create :instance

      before do
      get "/api/v2/#instance.slug/#type"
      end

      it 'responds with success status' do
      expect(last_response.status).to eq 200
      end
      end


      But today I tried to test the nested indexes. My issue is that the urls to tests are multiplied for the shared_examples so I can't use the same logic of doing the request in the before because last_response will be the last response (yes).



      My first try was to loop through the urls in the it block like follow :



      it 'responds with success status' do
      parent_types.each do |parent_type|
      get "/api/v2/#instance.slug/#parent_type/#instance.send(parent_type).first.uuid/#type"

      expect(last_response.status).to eq 200
      end
      end


      which does not work because the request is apparently not over when the expect is ran.



      So my second try was to loop in the parent shared example and pass url as a variable :



      RSpec.shared_examples 'nested_index' do
      context 'index without data' do
      it 'is nested in shows' do
      parent_types.each do |parent_type, parent_config|
      instance = create :instance, parent_config[:trait]

      url = "/api/v2/#instance.slug/#parent_type/#instance.send(parent_type).first.uuid/#type"
      it_behaves_like 'empty_nested_index', url
      end
      end
      end
      end


      but I get the error : it_behaves_like is not available from within an example. (e.g. an it block)



      And I can't access the let variable if I'm not in an it block so I'm kind of stuck. Any tip on restructuring my tests would be appreciated.







      ruby-on-rails api rspec






      share|improve this question















      share|improve this question













      share|improve this question




      share|improve this question








      edited Nov 15 '18 at 15:15







      Martin Ziserman

















      asked Nov 15 '18 at 15:05









      Martin ZisermanMartin Ziserman

      45




      45






















          0






          active

          oldest

          votes











          Your Answer






          StackExchange.ifUsing("editor", function ()
          StackExchange.using("externalEditor", function ()
          StackExchange.using("snippets", function ()
          StackExchange.snippets.init();
          );
          );
          , "code-snippets");

          StackExchange.ready(function()
          var channelOptions =
          tags: "".split(" "),
          id: "1"
          ;
          initTagRenderer("".split(" "), "".split(" "), channelOptions);

          StackExchange.using("externalEditor", function()
          // Have to fire editor after snippets, if snippets enabled
          if (StackExchange.settings.snippets.snippetsEnabled)
          StackExchange.using("snippets", function()
          createEditor();
          );

          else
          createEditor();

          );

          function createEditor()
          StackExchange.prepareEditor(
          heartbeatType: 'answer',
          autoActivateHeartbeat: false,
          convertImagesToLinks: true,
          noModals: true,
          showLowRepImageUploadWarning: true,
          reputationToPostImages: 10,
          bindNavPrevention: true,
          postfix: "",
          imageUploader:
          brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
          contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
          allowUrls: true
          ,
          onDemand: true,
          discardSelector: ".discard-answer"
          ,immediatelyShowMarkdownHelp:true
          );



          );













          draft saved

          draft discarded


















          StackExchange.ready(
          function ()
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53322327%2ftest-multiple-urls-in-nested-shared-examples-rspec%23new-answer', 'question_page');

          );

          Post as a guest















          Required, but never shown

























          0






          active

          oldest

          votes








          0






          active

          oldest

          votes









          active

          oldest

          votes






          active

          oldest

          votes















          draft saved

          draft discarded
















































          Thanks for contributing an answer to Stack Overflow!


          • Please be sure to answer the question. Provide details and share your research!

          But avoid


          • Asking for help, clarification, or responding to other answers.

          • Making statements based on opinion; back them up with references or personal experience.

          To learn more, see our tips on writing great answers.




          draft saved


          draft discarded














          StackExchange.ready(
          function ()
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53322327%2ftest-multiple-urls-in-nested-shared-examples-rspec%23new-answer', 'question_page');

          );

          Post as a guest















          Required, but never shown





















































          Required, but never shown














          Required, but never shown












          Required, but never shown







          Required, but never shown

































          Required, but never shown














          Required, but never shown












          Required, but never shown







          Required, but never shown







          這個網誌中的熱門文章

          Barbados

          How to read a connectionString WITH PROVIDER in .NET Core?

          Node.js Script on GitHub Pages or Amazon S3