请求javascript失败的规范,设计身份验证

时间:2013-02-14 15:51:42

标签: javascript ruby-on-rails rspec capybara

我正在尝试在需要身份验证的Web应用程序上测试操作(通过Devise)。具体操作使用javascript,因此我将js选项应用于规范:

scenario "User wants to fax a single document", js: true do
  reset_email
  @doc = @user.documents.create(FactoryGirl.attributes_for(:document))
  visit "/documents/#{@user.id}"

  click_on "send_document_#{@doc.id}"
  last_email.should eq(@doc)
end

控制器以电子邮件方式发送传真。我不确定为什么;我没有写。无论如何,在此功能规范的顶部(使用带有Rspec的Capybara),我使用

进行身份验证
before(:each) do
  # Signs in as an admin
  @company = FactoryGirl.create(:company)
  @subscription = FactoryGirl.create(:admin_subscription, company_id: @company.id)
  @user = FactoryGirl.create(:user, company_id: @company.id)
  login_as @user, scope: :user
end

文件中的所有其他规范(也需要登录)仍然通过,这让我觉得它与javascript有关。因此,js选项在Firefox中打开浏览器,页面不是正确的内容。它说

500 Internal Server Error
  undefined method `status' for nil:NilClass

我在线搜索过,发现只有回复说我的控制器中没有操作responseaction。请放心,我没有这样的行为;只有RESTful动作和两个附加功能:

def send_document
  @to = params[:to].gsub(/([() \-]+)/, '')
  #The below parses the number to format it for InterFax
  #It adds a "+1" to the front, and a dash in the middle 
  #of the number where needed.
  @to = "+1"+@to[0..-5]+"-"+@to[-4,4]
  @document = Document.find(params[:id])
  DocumentMailer.send_document(@to, @document).deliver
  render :template => false, :text => 'true'
end
def email_document
  @to = params[:to]
  @document = Document.find(params[:id])
  DocumentMailer.email_document(@to, @document).deliver
  render :template => false, :text => 'true'
end

任何人都可以帮助理解这些错误吗?很多这个应用程序都使用javascript,我真的需要一种方法来在登录时测试这些操作。

1 个答案:

答案 0 :(得分:0)

在未首先测试操作已完成的情况下,请注意检查非UI条件。当你这样做时:

  click_on "send_document_#{@doc.id}"
  last_email.should eq(@doc)

请记住,javascript正在浏览器实例中运行,该实例与您的测试代码不在同一个进程中。在继续之前检查页面上的更新可能会有所帮助:

  click_on "send_document_#{@doc.id}"
  page.should have_content("Email sent") # for example
  last_email.should eq(@doc)

Capybara声称在等待页面元素可见时非常聪明 - YMMV。

如果您的应用需要登录,您的请求规范应使用正常的登录过程 - 访问登录页面,输入凭据,然后导航到要测试的页面。