我的请求规范如下:
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)
时,响应的主体似乎不完整。你碰巧知道为什么吗?
答案 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)
通常不推荐的原因,因为如果您的任何示例改变了初始状态的某些内容,则后续示例将受到影响。