RSpec и странные результаты тестов - PullRequest
0 голосов
/ 31 марта 2011

Я пытаюсь сделать простое приложение.Когда я тестирую его в браузере, все работает нормально.Однако, когда я пытаюсь выполнить некоторые тесты с RSpec (2.5), он не работает, когда дело доходит до: создать тест для контроллера.

Вот мой метод создания:

def create
 @website = Website.new(params[:website])
 if @website.save

   flash[:notice] = "Website created."
   redirect_to(:action => 'list')
 else
   render('new')
 end
end

Тест контроллера:

describe WebsitesController do
  render_views
  .
  .
  .
  describe "POST 'create'" do
    before(:each) do
      @attr = { :adres => "www.excc.pl", :opis => "aaa "*22, :tagi => "aaa aaa aaa",
                :preview => File.new(Rails.root + 'spec/fixtures/rails.png'),
                :preview_mini => File.new(Rails.root + 'spec/fixtures/rails.png')}
    end
    describe "success" do
      it "should have the right title" do
        response.should have_selector("title", :content=>"Lista witryn w portfolio")
      end
    end
  .
  .
  .

Результат этого теста:

  1) WebsitesController POST 'create' should have the right title
     Failure/Error: response.should have_selector("title", :content=>"Lista witryn    w portfolio")
     expected following output to contain a <title>Lista witryn w portfolio</title> tag:
     <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
     # ./spec/controllers/websites_controller_spec.rb:34:in `block (4 levels) in

website_controller_spec.rb: 34 относится к методу создания

Однако этот тест пройден правильно (для неверных данных его следует перенаправить обратно на «новый» сайт с указанным названием):

it "should have the right title" do
    post :create, :website => @attr.merge(:adres => "")
    response.should have_selector("title", :content=>"Dodaj stronę WWW")
end

Вторая проблема ... Было время, когда у меня был такой результат теста:

<html><body>You are being <a href="http://test.host/websites/list">redire cted</a>.</body></html>

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

Буду признателен за любые мысли по этому поводу.

1 Ответ

0 голосов
/ 03 апреля 2011

Трудно понять, о чем здесь говорят, но я считаю, что проблема в том, что вы не устанавливаете условия для успеха / неудачи.Если я правильно понимаю, когда вы передаете пустой атрибут :adres, сохранение должно завершиться неудачно, и страница должна отобразить действие list.Таким образом, вы хотите заглушить метод create и вернуть true или false в зависимости от ожидаемого результата:

it "succeeds" do
  @website = mock_model(Website,:save=>true)
  Website.stub(:new) { @website }
  post :create, :website => {}
  # redirects
  response.should have_selector("etc etc")
end


it "fails" do
  @website = mock_model(Website,:save=>false)
  Website.stub(:new) { @website }
  post :create, :website => {}
  # renders 'new'
  response.should_not have_selector("etc etc")
end

Проверка правильности параметров должна выполняться в спецификации модели:

@website = Website.new(:adres=>"")
@website.should_not be_valid
...