Test ActiveModel::Serializer classes with Rspec

前端 未结 4 1923
故里飘歌
故里飘歌 2020-12-24 11:45

Given the following ActiveModel::Serializer class:

class SampleSerializer < ActiveModel::Serializer
  attributes :id, :name
end
4条回答
  •  粉色の甜心
    2020-12-24 12:37

    Assumptions

    This answer assumes you have the rspec-rails, active_model_serializers and factory_girl_rails gems installed and configured.

    This answer also assumes you have defined a factory for the Sample resource.

    Serializer spec

    For the current version(0.10.0.rc3) of active_model_serializers at the time of writing, ActiveModel::Serializer classes do not receive to_json and are , instead, wrapped in an adapter class. To obtain the serialization of a model wrapped in a serializer instance, an instance of an adapter must be created:

    before(:each) do
      # Create an instance of the model
      @sample = FactoryGirl.build(:sample)
    
      # Create a serializer instance
      @serializer = SampleSerializer.new(@sample)
    
      # Create a serialization based on the configured adapter
      @serialization = ActiveModelSerializers::Adapter.create(@serializer)
    end
    

    The adapter instance receives the to_json method and returns the serialization of the model.

    subject { JSON.parse(@serialization.to_json) }
    

    Expectations can then be run on the JSON returned.

    it 'should have a name that matches' do
      expect(subject['name']).to eql(@sample.name)
    end
    

    When parsing the JSON response, the adapter configuration must be taken into consideration:

    • The default config, :attributes, generates a JSON response without a root key:

      subject { JSON.parse(@serialization.to_json) }
      
    • The :json config generates a JSON response with a root key based on the model's name:

      subject { JSON.parse(@serialization.to_json)['sample'] }
      
    • The :json_api config generates a JSON that conforms to the jsonapi standard:

      subject { JSON.parse(@serialization.to_json)['data']['attributes'] }
      

提交回复
热议问题