簡體   English   中英

我在哪里將我的數據庫查詢測試放在 Rails 中?

[英]Where do I put my database query tests in rails?

我來自 Spring/hibernate 背景。 我注意到 Rails 沒有 dao 和服務層。 這確實加快了開發速度,但有時我不知道在哪里放置測試。

現在,我一直將我的 model 方法和驗證測試放在主要的 model 規范中。 這個文件已經相當大了。

測試查詢的“標准”位置在哪里? 我可以想象自己制作了很多固定裝置/虛擬數據以確保我的查詢按預期工作(可能是一個更好的主意,因為我是 Rails 新手)。 這些對於基本的 model 邏輯和驗證測試來說並不是真正需要的。

如果您可以提供一些關於將這些測試放在哪里的建議,使用 Rails 測試查詢的最佳方法(尤其是具有多個連接的查詢),以及可能與使用 DBunit/spring/hibernate 執行此操作有何不同的一些基本准則。 那很好啊。

謝謝!

我曾經也使用過 hibernate。 ActiveRecord 方式與 hibernate 非常不同。 無論是好是壞,你都需要讓你的思想自由。 在 java 和 Hibernate 中,您通常具有聚合根和 object 圖。 通常,object 圖和代碼庫在 ruby 中也更小。 我不知道你的具體情況,所以我會小心行事,但我警告你嘗試讓 ruby 和導軌適應你的 java 習慣。

您可以將自定義目錄與 rspec 一起使用,以對您和您的團隊有意義的方式進行組織。

#spec/queries/my_custom_search_spec.rb

require 'spec_helper'
describe MyModel do
  it "should do this query and return X" do
     subject.some_defined_scope_search.should == "something"
  end
end

你可能有子目錄,自動被 rspec 拾取,比如spec/models/account/..

該規范將由rake specrspec spec自動獲取。 我只是在上面寫了一個簡單的例子,因為我不知道你的情況。 您是使用查詢定義范圍,還是定義專門的方法?

我強烈建議放棄固定裝置(與插入相同 - 對我來說是反模式)以獲得更可重構的東西,例如工廠。 我喜歡factory_girl IMO,它讓您的應用程序以更敏捷的方式發展。

編輯:添加我的 spec_helper.rb 並設置啟用/禁用自動清理

RSpec.configure do |config|
  require 'database_cleaner'
  config.add_setting :skip_database_clean
  config.skip_database_clean = false
  config.before(:suite) do
    DatabaseCleaner.strategy = :truncation
  end

  config.before(:each) do
  end

  config.after(:each) do
    MongoMapper.database.collections.each(&:remove)
    DatabaseCleaner.clean unless config.skip_database_clean
  end

我添加了變量skip_database_clean以便我可以在每個規范(每個“它”)之后啟用/禁用自動清理。

  before :all do
    @an_object = some_expensive_test_buildup
    RSpec.configuration.skip_database_clean = true
  end
  after :all do
    RSpec.configuration.skip_database_clean = false
    DatabaseCleaner.clean
  end

Rails uses Arel to generate the SQL for your database queries based on relationships you define in Ruby code through the Rails ActiveRecord associations API (assuming you are using ActiveRecord as your ORM, it is the default). 如果您認為可以改進自動生成的內容(您可以在日志文件中看到),您可以編寫自己的 SQL。

通常,您將通過 model 上的方法調用來調用這些查詢(無論是手動編寫的還是自動編寫的)。 例如, @author.books@author.readers 這些可以體現一個有連接的查詢。

我不確定手寫查詢,但生成的查詢通常使用范圍構建,一旦完全構建,在請求結果時就會實現。 例如, @author.books.order('price').limit(10) 您可以定義自己的自定義范圍。

我將在 model 的單元測試中測試您的自定義查詢或范圍的正確性,以防它們是 model 工作不可或缺的一部分。 例如, @author.popular_books可能是在您的 model 上定義的自定義 scope,您可以為您的Author model 數據編寫單元測試,以確保它返回一些已知的測試結果。

如果您使用普通的 rails ORM,則無需創建查詢,也無需測試數據訪問。

如果您確實開始編寫自定義 SQL 查詢,那么我建議您使用 rspec 並在執行查詢后測試對象的行為。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM