2009-09-21 40 views
4

我正在嘗試爲我的應用程序編寫一些黃瓜測試,該應用程序使用Authlogic進行身份驗證,但實際上將用戶存儲在LDAP服務器中。使用LDAP服務器進行Rails黃瓜測試

該應用程序似乎工作正常,但我遇到麻煩的地方是爲它編寫測試(我知道,我知道,我應該先寫測試。)很容易有一個測試數據庫,其中的數據在每次運行後被清除,但對LDAP服務器來說並不那麼容易。

我的想法是編寫一個rake任務(比如rake ldap:test:prepare),以在每次運行之前刷新ldap服務器(或者使其成爲依賴),但是當我正在進行測試時,這似乎相當耗時並使得自動測試幾乎是不可能的。)

有沒有更好的方式來做到這一點?有沒有一個基於ruby的假LDAP服務器可以綁定到預定義的燈具?有沒有其他更優雅的解決方案,我沒有想到? (不使用LDAP不是一個選項。)

回答

2

所以一般黃瓜測試是集成與驗收測試。情況就是這樣,它應該測試系統端到端,所以它也應該測試LDAP集成。我的建議是,如果你可以擺動它,那就是建立另一個LDAP服務器,並且定期從你的實時轉儲轉儲它來設置你需要的任何測試數據。

我會說雖然這具有刷新LDAP數據庫之前每次運行是「正確」的方式做到這一點依賴你的第一個想法。整合/驗收測試是假設需要很長時間。它正在測試整個系統的功能,而不僅僅是小的(單元)件。

黃瓜是不是一個單元測試框架,並且不應該以這種方式來使用。如果您的應用程序遷移到2.3.4後分手,因爲你沒有測試,我想你應該在那裏得到的,並開始編寫一些單元測試...

現在,這是我個人的偏見,但如果你沒有單元測試到位我會看看RSpec。如果你喜歡Cucumber的英文句法,RSpec肯定會有類似的感覺。如果您已經在Test :: Unit中進行了一些測試,我肯定會建議將Shoulda帶入聚會或可能Context/Matchy(所有這些都可在github上獲得),以使RSpec感受到Test :: Unit框架。

+0

似乎合理。我有點希望會有一些神奇的寶石可以嘲弄我在github,rubyforge或google找不到的LDAP服務器,所以我實際上並不需要做這項工作。 我正在嘗試通過Rails提供的所有測試選項,並感受到那裏所有的選擇和強烈的意見。不過,我喜歡你對不同測試框架不同角色的解釋,所以我會接受這個答案。謝謝! –

0

不是一個真正的答案,但...我工作在一個非常類似的問題,測試LDAP身份驗證和查找代碼黃瓜。你有沒有在考試中使用存根?我正在考慮扼殺我的LDAP響應......只是還沒有想出如何去做。

馬特

+0

我遲到了測試遊戲(升級到2.3.4打破了我的應用程序之一,所以我決定是時候開始編寫一些測試..),所以我不十分精通所有人們使用的技術(例如,我聽說過術語stub,但就我的知識而言,這是大概的),所以我認爲有一個簡單且可接受的最佳實踐,我只是不知道,而不是一些複雜的測試LDAP服務器解決方但是,還沒有人回答,所以也許沒有! –

2

,我終於可以得到解決,基本清潔的LDAP服務器的每個場景黃瓜運行前。我這樣做是通過添加一個勾入黃瓜

Before do |scenario| 
    puts "Cleaning Up LDAP Server" 
    LdapConnect.new(:admin => true).clear_users! 
end 

然後我LdapConnect類(因爲多個模型可能需要觸摸LDAP服務器,我可以繞過這個對象)。我使用的紅寶石淨LDAP寶石的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 | 
    | [email protected] | right_password | externalPerson | external | person | 
    | [email protected] | right_password | internalPerson | internal | person | 
    | [email protected] | right_password | adminPerson | admin | person | 

    Scenario: Success Login Check 
    Given I am logged in as "[email protected]" 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 
1

我已經我自己也在研究這個,並且遇到了相當不足的fakeldap寶石。

http://github.com/aanand/fakeldap http://rubygems.org/gems/fakeldap

我使用後,我可以添加到這個答案有一定的經驗。

+0

太棒了。到目前爲止,我剛剛在3389上運行一個測試LDAP服務器,然後在每次測試之前基本上刪除並重新創建整個根樹。這應該是非常有幫助的! –

8

使用Ladle作爲一個測試LDAP服務器:「提供輕量級目錄訪問(LDAP)的蒸汽幫助,用於使用rspec,黃瓜或任何其他ruby測試框架進行測試」。

https://github.com/NUBIC/ladle

+2

非常感謝您的建議。如果這是按照廣告的方式工作的話,那對我來說將是一件非常重要的事情。 –

+0

小世界。看起來像我見過的最完整和最簡單的實現。 –