diff --git a/lib/action_controller/serialization_test_case.rb b/lib/action_controller/serialization_test_case.rb index b6a57d03..ee75fc99 100644 --- a/lib/action_controller/serialization_test_case.rb +++ b/lib/action_controller/serialization_test_case.rb @@ -30,6 +30,9 @@ module ActionController # # assert that the "PostSerializer" serializer was rendered # assert_serializer "PostSerializer" # + # # assert that the instance of PostSerializer was rendered + # assert_serializer PostSerializer + # # # assert that the "PostSerializer" serializer was rendered # assert_serializer :post_serializer # @@ -39,37 +42,41 @@ module ActionController # # assert that no serializer was rendered # assert_serializer nil # + # def assert_serializer(options = {}, message = nil) # Force body to be read in case the template is being streamed. response.body - case options - when NilClass, Regexp, String, Symbol - rendered = @serializers - msg = message || "expecting <#{options.inspect}> but rendering with <#{rendered.keys}>" + rendered = @serializers + msg = message || "expecting <#{options.inspect}> but rendering with <#{rendered.keys}>" - matches_serializer = - case options - when Symbol - options = options.to_s.camelize - rendered.any? do |serializer, count| - serializer == options - end - when String - !options.empty? && rendered.any? do |serializer, count| - serializer == options - end - when Regexp - rendered.any? do |serializer, count| - serializer.match(options) - end - when NilClass - rendered.blank? - end - assert matches_serializer, msg - else - raise ArgumentError, "assert_serializer only accepts a String, Symbol, Regexp, or nil" - end + matches_serializer = case options + when lambda { |options| options.kind_of?(Class) && options < ActiveModel::Serializer } + rendered.any? do |serializer, count| + options.name == serializer + end + when NilClass, Regexp, String, Symbol + case options + when Symbol + options = options.to_s.camelize + rendered.any? do |serializer, count| + serializer == options + end + when String + !options.empty? && rendered.any? do |serializer, count| + serializer == options + end + when Regexp + rendered.any? do |serializer, count| + serializer.match(options) + end + when NilClass + rendered.blank? + end + else + raise ArgumentError, "assert_serializer only accepts a String, Symbol, Regexp, ActiveModel::Serializer, or nil" + end + assert matches_serializer, msg end end end diff --git a/test/integration/action_controller/serialization_test_case_test.rb b/test/integration/action_controller/serialization_test_case_test.rb index abfefc95..9532a88b 100644 --- a/test/integration/action_controller/serialization_test_case_test.rb +++ b/test/integration/action_controller/serialization_test_case_test.rb @@ -15,6 +15,11 @@ module ActionController tests MyController + def test_supports_specifying_serializers_with_a_serializer_class + get :render_using_serializer + assert_serializer ProfileSerializer + end + def test_supports_specifying_serializers_with_a_regexp get :render_using_serializer assert_serializer %r{\AProfile.+\Z} @@ -43,12 +48,13 @@ module ActionController assert_match 'expecting <"PostSerializer"> but rendering with <["ProfileSerializer"]>', e.message end + def test_raises_argument_error_when_asserting_with_invalid_object get :render_using_serializer e = assert_raise ArgumentError do - assert_serializer OpenStruct.new + assert_serializer Hash end - assert_match 'assert_serializer only accepts a String, Symbol, Regexp, or nil', e.message + assert_match 'assert_serializer only accepts a String, Symbol, Regexp, ActiveModel::Serializer, or nil', e.message end end end