0

我有一个看起来像这样的请求规范:

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). 你碰巧知道为什么吗?

4

2 回答 2

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

于 2012-04-06T12:25:46.493 回答
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)and的问题before(:each)before(:each)将在每个示例(it块)之前调用一次,而在块中的所有示例之前只before(:all)调用一次describe。这就是为什么before(:all)通常不建议这样做的原因,因为如果您的任何示例更改了初始状态的某些内容,那么以后的示例将受到影响。

于 2012-04-06T11:58:44.380 回答