什么是测试“创造”的控制器操作的正确方法?(What is the proper way to te

2019-07-29 08:56发布

我使用on Rails的3.2.2,2.9.0 Rspec的和RspecRails 2.9.0红宝石。 我想测试的create控制器行动,但我不知道怎么做“正确的” /“正确”的方式。 我“脚手架”的模式,控制器,视图,...文件,所以这些文件我对Rails生成由红宝石产生的公共代码; 在我的规格文件我有:

it "assigns @article" do
  new_article = FactoryGirl.build(:article)
  Article.should_receive(:new).and_return(new_article)
  post :create
  assigns[:article].should eq(new_article)
end

也许,( :上面的代码几乎是一样的,我用它来测试new控制器动作) 更好的方式来测试create控制器动作将是在传递一些属性值post :create行动,而不是继续为我做以上 ,但我不知道如何使这一点,如果它是“正确的” /“正确”的方式让事情。

那么, 什么是测试“创造”的控制器操作的正确方法?

Answer 1:

怎么样:

it "creates article" do 
  article_params = FactoryGirl.attributes_for(:article)
  expect { post :create, :article => article_params }.to change(Article, :count).by(1) 
end


Answer 2:

我做这样说:

describe "#create" do
  before { post :create, { "my_model"=> { "name"=>"name" } } }
  specify("should created one my_model") { change{ MyModel.count }.from(0).to(1) }
end

亚伦·萨姆纳谁最近写了一本书每天Rails进行测试使用RSpec有一个在他的博客文章 。 当他描述的是这样的:

describe "POST create" do
  context "with valid attributes" do
    it "creates a new contact" do
      expect{
        post :create, contact: Factory.attributes_for(:contact)
      }.to change(Contact,:count).by(1)
    end

    it "redirects to the new contact" do
      post :create, contact: Factory.attributes_for(:contact)
      response.should redirect_to Contact.last
    end
  end

  context "with invalid attributes" do
    it "does not save the new contact" do
      expect{
        post :create, contact: Factory.attributes_for(:invalid_contact)
      }.to_not change(Contact,:count)
    end

    it "re-renders the new method" do
      post :create, contact: Factory.attributes_for(:invalid_contact)
      response.should render_template :new
    end
  end 
end


文章来源: What is the proper way to test 'create' controller actions?