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

Я пытаюсь протестировать сбойную ветвь действия обновления на моем контроллере, но у меня возникают проблемы с тестом. Это то, что у меня есть, и оно терпит неудачу на последнем

describe "PUT 'article/:id'" do
.
.
.
  describe "with invalid params" do
    it "should find the article and return the object" do
      Article.stub(:find).with("1").and_return(@article)
    end

    it "should update the article with new attributes" do
      Article.stub(:update_attributes).and_return(false)
    end

    it "should render the edit form" do
      response.should render_template("edit")
    end
  end
end

Любые идеи относительно того, почему последняя часть не может отобразить шаблон?


person luis.madrigal    schedule 14.08.2011    source источник


Ответы (2)


Вы неправильно делите части теста. Каждый вызов it на самом деле является новым примером, и состояние сбрасывается до/после каждого из них.

Что вы должны делать, так это:

describe "with invalid params" do
  before do
    @article = Article.create(valid_params_go_here)
  end

  it "should find the article and return the object" do
    put :update, { :id => @article.id, :article => { :title => "" } }
    response.should render_template("edit")
  end
end

Делая это таким образом, @article настраивается заранее (хотя вы могли бы использовать имитацию, если вы действительно хотели), а также запрос к действию update и утверждение, что оно действительно отображает edit шаблон все происходит в одном примере.

person Ryan Bigg    schedule 15.08.2011
comment
Спасибо за ответ. Так что, если бы я объединил их в один, было бы лучше. Это правильный способ проверить это? it "should find the article and return the object" do Article.stub(:find).with("1").and_return(@article) Article.stub(:update_attributes).and_return(false) put :update, { :id => "1", :article => {:title => nil}} response.should render_template("edit") end - person luis.madrigal; 15.08.2011
comment
@luis: Да, вы могли бы сделать это таким образом. - person Ryan Bigg; 15.08.2011

Для людей, которые приедут сюда в 2018 году, были сделаны некоторые обновления (каламбур). Важно включить «параметры» перед перечислением параметров. Кроме того, вы должны использовать «ожидание», а не «следует», так как в Rails 6.0 это будет объявлено устаревшим.

describe "with invalid params" do
  before(:each) do
    @article = Article.create(valid_params_go_here)
  end

describe "PATCH update/:id" do
  it "should find the article and return the object" do
    put :update, params: { id: @article.id, article: { title: "" } }
    expect(response).to be_redirect
  end
end
person chase dougherty    schedule 21.06.2018