home articles sponsorship

Enough RSpec

How to force the user as the serializer’s scope:

  # spec/serializers/book_serializer_spec.rb

  RSpec.describe BookSerializer do
    subject(:serialized_book) { serialize(book, scope: user) }

    let(:user) { create :user }
    let(:book) { ... }

    # test stuff
  end

Based on how you define the it part, different behaviors are to be expected:

  # spec/serializers/things_controller_spec.rb

  RSpec.describe ThingsController do
    subject { post :create, params: params }

    # Implicitly calls subject
    it { is_expected.to redirect_to(thing_path(Thing.last)) }

    # Explicitly call subject
    it "redirects to the new thing's show" do
      expect(subject).to redirect_to(thing_path(Thing.last))
    end

    # Does not call subject
    # For this test to work, a before { subject } is needed
    it 'has correct flash message' do
      expect(flash[:notice]).to eq "The thing has been created."
    end
  end

Fixtures

Just wrote this for mocking the return value of a facade sub-class (SomeDomainName::FacadeTo3rdPartyAPI::Response):

    let(:expected_response) do
      OpenStruct.new(content: "art, renaissance, Giotto")
    end