Тест RSpec не вызывает контроллер - PullRequest
4 голосов
/ 15 июля 2011

У меня есть простой тест, в значительной степени то, что сгенерировал скаффолд, хотя я не могу понять, почему он не работает. Вот ситуация:

У меня есть контроллер вложений:

  # POST /attachments
  # POST /attachments.xml
  def create
    @attachment = Attachment.new(params[:attachment])
    @attachment.idea_id = params[:idea_id]

    respond_to do |format|
      if @attachment.save
        format.html { redirect_to(idea_path(params[:idea_id]), :notice => 'Attachment was successfully created.') }
        format.xml  { render :xml => @attachment, :status => :created, :location => @attachment }
      else
        format.html { render :action => "new" }
        format.xml  { render :xml => @attachment.errors, :status => :unprocessable_entity }
      end

    end
  end
end

И спецификация:

describe AttachmentsController do
  def mock_attachment(stubs={})
    @mock_attachment ||= mock_model(Attachment, stubs).as_null_object
  end

  describe "POST create" do
    describe "with valid params" do
      it "assigns a newly created attachment as @attachment" do
        Attachment.stub(:new).with({'these' => 'params'}) { mock_attachment(:save => true) }
        post :create,:attachment => {'these' => 'params'}
        assigns(:attachment).should be(mock_attachment)
      end

но это (и все остальные тесты в этой спецификации) терпят неудачу с чем-то вроде

expected #<Attachment:33902000> => #<Attachment:0x2054db0 @name="Attachment_1001">
     got #<NilClass:4> => nil

Потому что, по причинам, которые я не могу понять, AttachmentsController # create не вызывается.

Маршрут есть:

POST   /attachments(.:format)          {:action=>"create", :controller=>"attachments"}

Вот что говорит журнал:

  Processing by AttachmentsController#create as HTML
  Parameters: {"attachment"=>{"these"=>"params"}}
Rendered text template (0.0ms)
Completed 302 Found in 52ms (Views: 23.1ms | ActiveRecord: 0.0ms)

Я должен также отметить, что я могу вызывать код создания (и он прекрасно работает) через сам веб-сайт ... это просто тесты, которые не проходят.

Так, что заставило бы post () или get () не вызывать контроллер, подобный этому?

Ответы [ 2 ]

8 голосов
/ 19 сентября 2015

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

3 голосов
/ 15 июля 2011

Вы можете попробовать should_receive и поместить его в блок перед, так как это лучший метод:

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