Как проверить ответ JSON с помощью RSpec? - PullRequest
139 голосов
/ 01 марта 2011

В моем контроллере есть следующий код:

format.json { render :json => { 
        :flashcard  => @flashcard,
        :lesson     => @lesson,
        :success    => true
} 

В моем тесте контроллера RSpec я хочу убедиться, что определенный сценарий действительно получает ответ json, поэтому у меня была следующая строка:

controller.should_receive(:render).with(hash_including(:success => true))

Хотя, когда я запускаю свои тесты, я получаю следующую ошибку:

Failure/Error: controller.should_receive(:render).with(hash_including(:success => false))
 (#<AnnoController:0x00000002de0560>).render(hash_including(:success=>false))
     expected: 1 time
     received: 0 times

Я неправильно проверяю ответ?

Ответы [ 11 ]

0 голосов
/ 28 сентября 2012

Я нашел совпадение клиентов здесь: https://raw.github.com/gist/917903/92d7101f643e07896659f84609c117c4c279dfad/have_content_type.rb

Поместите его в spec / support / matchers / have_content_type.rb и убедитесь, что загружаете вещи из поддержки с чем-то подобным в вашем spec / spec_helper.rb

Dir[Rails.root.join('spec/support/**/*.rb')].each {|f| require f}

Вот сам код, на тот случай, если он исчез из указанной ссылки.

RSpec::Matchers.define :have_content_type do |content_type|
  CONTENT_HEADER_MATCHER = /^(.*?)(?:; charset=(.*))?$/

  chain :with_charset do |charset|
    @charset = charset
  end

  match do |response|
    _, content, charset = *content_type_header.match(CONTENT_HEADER_MATCHER).to_a

    if @charset
      @charset == charset && content == content_type
    else
      content == content_type
    end
  end

  failure_message_for_should do |response|
    if @charset
      "Content type #{content_type_header.inspect} should match #{content_type.inspect} with charset #{@charset}"
    else
      "Content type #{content_type_header.inspect} should match #{content_type.inspect}"
    end
  end

  failure_message_for_should_not do |model|
    if @charset
      "Content type #{content_type_header.inspect} should not match #{content_type.inspect} with charset #{@charset}"
    else
      "Content type #{content_type_header.inspect} should not match #{content_type.inspect}"
    end
  end

  def content_type_header
    response.headers['Content-Type']
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...