我在使用Rspec测试控制器的更新操作时遇到问题,我做错了什么?

时间:2011-08-14 23:44:45

标签: ruby-on-rails-3 tdd bdd rspec2

我正在尝试在我的控制器上测试更新操作的失败分支,但我在测试时遇到问题。这就是我所拥有的,它在最后的

失败了
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

关于为什么最后一部分无法呈现模板的任何想法?

2 个答案:

答案 0 :(得分:5)

您错误地拆分了部分测试。每个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模板的断言都发生在一个例子中。

答案 1 :(得分:0)

对于2018年要来这里的人们,已经进行了一些更新(双关语意)。在列出参数之前,请包含“ params”,这一点很重要。另外,您应该使用Expect而不是“ should”,因为它将在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