写这个请求规范的更好方法是什么?

时间:2012-04-06 11:50:25

标签: ruby ruby-on-rails-3 rspec capybara

我的请求规范如下:

describe "Registering from the main page" do
  before(:each) do
    fill_in "username","my_username"
    fill_in "password","my_password"
    fill_in "password_confirmation","my_password"
    click_button "Register"
  end

  it "should have created a new user" do
    User.count.should == 1
  end

  it "should have changed the message on the homepage" do
    find("#element").value.should == "You registered!"
  end

  # ... other tests like this
end

第一个问题,在提交表单之前如何确保我有0个用户?

其次,before对我来说似乎并不合适,即使它能够胜任。是否有另一种方法为整个注册用例编写测试?或许以某种方式重新制定前一部分,或者我可以接受的方式接受它?

更新:我将before(:all)更改为before(:each),因为测试开始失败。当我使用before(:all)时,响应的主体似乎不完整。你碰巧知道为什么吗?

2 个答案:

答案 0 :(得分:2)

你也可以把它写成

expect { click_button "Register" }.to change(User, :count).by(1)

请看一下这个链接:http://ruby.railstutorial.org/chapters/sign-up?version=3.2#sec:tests_for_user_signup

答案 1 :(得分:1)

您可以使用change()匹配器,以免事先担心计数:

lambda { click_button("Register") }.should change{ User.count }.by(1)

如果你真的希望它专门从0到1,你可以这样做:

lambda { click_button("Register") }.should change{ User.count }.from(0).to(1)

要回答有关before(:all)before(:each)的问题,before(:each)会在每个示例(it块)之前调用一次,而before(:all)会被调用<在describe块中的所有示例之前强>仅一次。这就是为什么before(:all)通常不推荐的原因,因为如果您的任何示例改变了初始状态的某些内容,则后续示例将受到影响。