Понимание RSpec и среды тестирования Rails - PullRequest
2 голосов
/ 17 февраля 2011

Возможно, это простой ответ, который связан с издевательством или заглушкой, но я новичок и пытаюсь лучше понять вещи ... Я пытаюсь понять, почему ресурсы тестирования на самом деле не deleted?, но спецификации проходят так они были? Это может (или не может) быть уникальным для RSpec?!?

У меня есть новый проект, использующий RSpec и сгенерированный каркас для простого ресурса

$ rails new destroyer -T
...
$ rails generate rspec:install
...
$ rails g scaffold resource name:string

Все работает, как положено, и спецификации проходят. Но у меня произошли некоторые любопытные вещи, и тесты провалились в другом проекте, поэтому копаясь глубже, я добавил некоторые записи в свой метод уничтожения, чтобы посмотреть, что происходит:

#app/controllers/resources_controller.rb
def destroy
  @resource = Resource.find(params[:id])
  @resource.destroy
  logger.info "Resource Destroyed: #{@resource.destroyed?}" # <-- added
  logger.info "Persisted after destroy: #{@resource.persisted?}" # <-- added

  respond_to do |format|
    format.html { redirect_to(resources_url) }
    format.xml  { head :ok }
  end
end

Когда я уничтожаю ресурс, я замечаю это (####) несоответствие в моих журналах:

development.log

Started POST "/resources/3" for 127.0.0.1 at 2011-02-16 12:28:25 -0800
  Processing by ResourcesController#destroy as HTML
  Parameters: {"authenticity_token"=>"87+THlPY2Ni7vQCONbeSqwfoeXI2fesc7DIj6EMSaw=", "id"=>"3"}
  Resource Load (0.2ms)  SELECT "resources".* FROM "resources" WHERE "resources"."id" = 3 LIMIT 1
  AREL (0.5ms)  DELETE FROM "resources" WHERE "resources"."id" = 3
Resource Destroyed: true               # <<<<  ###### TRUE ######
Persisted after destroy: false
Redirected to http://localhost:4002/resources
Completed 302 Found in 30ms

и после запуска спецификации я вижу это в test.log :

  Processing by ResourcesController#destroy as HTML
  Parameters: {"id"=>"1"}
Resource Destroyed: false              # <<<<  ###### FALSE ######
Persisted after destroy: false
Redirected to http://test.host/resources
Completed 302 Found in 4ms

Почему мы видим разные состояния (destroyed?) ресурса в зависимости от среды, в которой мы работаем?

Ответы [ 2 ]

3 голосов
/ 17 февраля 2011

Если вы используете сгенерированные спецификации контроллера, вы увидите что-то подобное для действия уничтожения:

require 'spec_helper'

describe PostsController do

  def mock_post(stubs={})
    @mock_post ||= mock_model(Post, stubs).as_null_object
  end

  it "destroys the requested post" do
    Post.stub(:find).with("37") { mock_post }
    mock_post.should_receive(:destroy)
    delete :destroy, :id => "37"
  end
end

Спецификация не создает экземпляр реального Post объекта, а использует mock_model для создания макета (или «двойного теста»).Чтобы упростить тестирование моделей, макеты, созданные с помощью mock_model, заглушают некоторые методы ActiveRecord, включая destroyed? и persisted?.В результате эти макеты не будут вести себя точно так же, как реальные экземпляры модели.

0 голосов
/ 17 февраля 2011

Я не уверен, но кажется логичным, что поскольку каждый пример выполняется изолированно внутри транзакции, ресурс не будет помечен как уничтоженный до тех пор, пока транзакция не будет зафиксирована. Если вы выполняете то же самое в сценарии с огурцом, вы, вероятно, увидите те же результаты, что и в своем файле development.log.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...