Ruby 编写此请求规范的更好方法?
我有一个如下所示的请求规范:Ruby 编写此请求规范的更好方法?,ruby,ruby-on-rails-3,rspec,capybara,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
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个用户
第二,在我看来,之前的似乎不太合适,尽管它确实起到了作用。是否有其他方法为整个注册用例编写测试?也许以某种方式重新表述前面的部分,或者我现在的方式可以接受吗
更新:我将(:all)
之前的更改为(:each)
之前的,因为测试开始失败。当我使用(:all)
之前的时,响应主体似乎不完整。你知道为什么吗?你可以使用change()
匹配器,这样就不用担心事先的计数了:
如果确实希望它从0变为1,可以执行以下操作:
lambda{click_按钮(“Register”)}。应将{User.count}.从(0).更改为(1)
要回答关于before(:all)
和before(:each)
的问题,before(:each)
将在每个示例(it
块)之前调用一次,而before(:all)
仅在描述
块中的所有示例之前调用一次。这就是为什么通常不建议使用before(:all)
,因为如果您的任何示例更改了初始状态的某些内容,则以后的示例将受到影响。您可以使用change()
匹配器,这样就不必担心之前的计数是多少:
如果确实希望它从0变为1,可以执行以下操作:
lambda{click_按钮(“Register”)}。应将{User.count}.从(0).更改为(1)
要回答关于before(:all)
和before(:each)
的问题,before(:each)
将在每个示例(it
块)之前调用一次,而before(:all)
仅在描述
块中的所有示例之前调用一次。这就是为什么通常不建议使用(:all)
之前的,因为如果您的任何示例更改了初始状态的某些内容,则以后的示例将受到影响。您也可以将其编写为
expect { click_button "Register" }.to change(User, :count).by(1)
看看这个链接:你也可以把它写成
expect { click_button "Register" }.to change(User, :count).by(1)
查看此链接:它位于(:each)
块之前的中这一事实如何?有没有办法把它弄出来?除了行点击按钮“Register”
,我认为代码在正确的位置。它是为测试注册做准备的,并且它似乎需要用于所有示例,因此before(:each)
很好。另外,添加了一些内容来解决before(:all)
/before(:each)
问题。它位于before(:each)
块中的事实如何?有没有办法把它弄出来?除了行点击按钮“Register”
,我认为代码在正确的位置。它是为测试注册做准备的,而且似乎所有示例都需要它,因此(:each)
之前的很好。另外,添加了一些内容来解决(:each)
之前的问题(:each)
。