Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/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 on rails Rails正在使用LDAP服务器进行测试_Ruby On Rails_Ldap_Cucumber_Authlogic - Fatal编程技术网

Ruby on rails Rails正在使用LDAP服务器进行测试

Ruby on rails Rails正在使用LDAP服务器进行测试,ruby-on-rails,ldap,cucumber,authlogic,Ruby On Rails,Ldap,Cucumber,Authlogic,我试图为我的应用程序编写一些Cumber测试,它使用Authlogic进行身份验证,但实际上将用户存储在LDAP服务器中 应用程序似乎工作正常,但我遇到麻烦的地方是为它编写测试(我知道,我知道,我应该先编写测试。)有一个测试数据库,每次运行后数据都会被清除,这很容易,但使用LDAP服务器就不那么容易了 我的想法是编写一个rake任务(比如rakeldap:test:prepare)来在每次运行之前刷新ldap服务器(或者使其成为一个依赖项),但在我进行测试时,这似乎相当耗时(并且使自动测试几乎不

我试图为我的应用程序编写一些Cumber测试,它使用Authlogic进行身份验证,但实际上将用户存储在LDAP服务器中

应用程序似乎工作正常,但我遇到麻烦的地方是为它编写测试(我知道,我知道,我应该先编写测试。)有一个测试数据库,每次运行后数据都会被清除,这很容易,但使用LDAP服务器就不那么容易了

我的想法是编写一个rake任务(比如rakeldap:test:prepare)来在每次运行之前刷新ldap服务器(或者使其成为一个依赖项),但在我进行测试时,这似乎相当耗时(并且使自动测试几乎不可能)


有更好的方法吗?是否有一个基于ruby的假LDAP服务器可以通过预定义的装置绑定到?还有其他更优雅的解决方案吗?(不使用LDAP不是一个选项。)

不是一个真正的答案,但是…我正在处理一个非常类似的问题,用cucumber测试LDAP身份验证和查找代码。您是否考虑过在测试中使用存根?我正在考虑删除我的LDAP响应…只是还没有弄明白怎么做


Matt

因此,一般来说,Cumber测试用于集成和验收测试。在这种情况下,它应该测试系统的端到端,因此它也应该测试LDAP集成。我的建议是,如果您可以使用它,可以设置另一个LDAP服务器,并定期从您的活动服务器转储数据,以使用您需要的任何测试数据来设置它

不过,我要说的是,您的第一个想法是在每次运行之前刷新LDAP数据库的依赖关系,这是一种“正确”的方法。集成/验收测试应该需要很长时间。它正在测试系统的全部功能,而不仅仅是小(单元)部分

Cucumber不是一个单元测试框架,不应该以这种方式使用。如果您的应用程序在迁移到2.3.4后因为没有测试而出现故障,我认为您应该开始编写一些单元测试


这是我个人的偏见,但如果没有单元测试,我会看看RSpec。如果你喜欢Cucumber的英语语法,RSpec肯定会有类似的感觉。如果您已经在Test::Unit中进行了一些测试,我肯定会建议您将Shoulda带到聚会上,或者可能带上Context/Matchy(所有这些都可以在github上获得),以便在Test::Unit框架中获得RSpec的感觉。

在每个场景运行之前,我终于能够基本上清理ldap服务器。我在黄瓜上加了一个钩子

Before do |scenario|
  puts "Cleaning Up LDAP Server"
  LdapConnect.new(:admin => true).clear_users!
end
然后是我的LdapConnect类(因为多个模型可能需要接触ldap服务器,所以我可以传递这个对象)。我正在使用ruby net ldap gem进行ldap交互

class LdapConnect

  def initialize(params = {})
    ldap_config = YAML.load_file("#{RAILS_ROOT}/config/ldap.yml")[RAILS_ENV]
    ldap_options = params.merge({:encryption => :simple_tls})

    @ldap = Net::LDAP.new(ldap_options)
    @ldap.host = ldap_config["host"]
    @ldap.port = ldap_config["port"]
    @ldap.base = ldap_config["base"]
    @ldap.auth ldap_config["admin_user"], ldap_config["admin_password"] if params[:admin] 
  end

  def ldap
    @ldap
  end

  def clear_users!(base = "ou=people,dc=test,dc=com")
    raise "You should ONLY do this on the test enviornment! It will clear out all of the users in the LDAP server" if RAILS_ENV != "test"
    if @ldap.bind
      @ldap.search(:filter => "cn=*", :base => base) do |entry|
        @ldap.delete(:dn => entry.dn)
      end
    end
  end

end
所以,我的黄瓜特征看起来像:

Feature: Check to make sure users can login
  In order to make sure users can login with the LDAP server
  As a user
  I want to make sure the user can login

  Background:
    Given I have the following users
    | email | password | user_class | first_name | last_name |
    | external@test.com | right_password | externalPerson | external | person |
    | internal@test.com | right_password | internalPerson | internal | person |
    | admin@test.com | right_password | adminPerson | admin | person |

  Scenario: Success Login Check
    Given I am logged in as "external@test.com" with password "right_password"
    Then I should be on the homepage
最后是步骤

Given /^I have the following users$/ do |table|
  # table is a Cucumber::Ast::Table
  table.hashes.each do |hash|
    hash[:password_confirmation] == hash[:password] unless hash[:password_confirmation]
    User.create(hash)
  end
end

Given /^I am logged in as "([^\"]*)" with password "([^\"]*)"$/ do |email, password|
  visit login_url  
  fill_in "Email", :with => email  
  fill_in "Password", :with => password  
  click_button "Login" 
end

我自己也在研究这件事,发现了一块相当隐蔽的宝石

http://rubygems.org/gems/fakeldap


在使用之后,我可能会以一些经验补充这个答案。

尝试使用Leap作为测试LDAP服务器:“Leap提供了轻量级目录访问(LDAP)的大量帮助,用于rspec、cucumber或任何其他ruby测试框架的测试”


我的测试游戏迟到了(升级到2.3.4后,我的一个应用程序坏了,所以我决定是时候开始编写一些测试了……),因此我对人们使用的所有技术都不是很精通(例如,我听过术语存根,但这是我所知的最新情况),所以我想有一个简单且可接受的最佳实践,我只是不知道,而不是一些复杂的测试LDAP服务器解决方案。但是,还没有人回答,所以可能没有!看起来很合理。我有点希望会有一些神奇的宝石来模仿LDAP服务器,我在github、rubyforge或google上找不到它,所以我实际上不需要做这项工作。我正在努力完成Rails可用的所有测试选项,并对所有的选择和强烈的意见感到有点不知所措。不过,我很喜欢你们对不同测试框架的不同角色的解释,所以我将接受这个答案。谢谢太棒了。到目前为止,我只是在3389上运行了一个测试LDAP服务器,然后基本上在每次测试之前删除并重新创建整个根目录树。这应该是非常有帮助的!非常感谢你的建议。如果这是广告宣传的,它将是我的一项重要资产。小世界。似乎是我见过的最完整、最简单的实现。