Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 编写此请求规范的更好方法?_Ruby_Ruby On Rails 3_Rspec_Capybara - Fatal编程技术网

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)