2011-09-28 14 views
5

के बिना एक सक्रिय रिकॉर्ड मॉडल नकली मुझे लगता है कि मुझे कुछ याद आ रहा है। मैं एक रूबी मणि लिख रहा हूं जो सक्रिय रिकॉर्ड के साथ अपने प्राथमिक कार्य में जोड़ने के रूप में बातचीत की अनुमति देता है।डीबी

इसके लिए टेस्ट केस लिखने में, मुझे इस कार्यक्षमता का परीक्षण करने के लिए डमी सक्रिय रिकॉर्ड मॉडल निर्दिष्ट करने में सक्षम होना चाहिए। यह शानदार होगा अगर मैं एक सक्रिय रिकॉर्ड मॉडल का उदाहरण प्राप्त कर सकूं जिसे किसी डीबी से कनेक्शन की आवश्यकता नहीं है, जिसमें संबंध हो सकते हैं, सभी चीजें, लेकिन मुझे डेटाबेस में टेबल सेट करने की आवश्यकता नहीं थी। मैं परीक्षण करने के लिए बिल्कुल नया हूं, और रेल परीक्षण के बाहर मैं बहुत बड़ा डांग हूं, लेकिन ऐसा लगता है कि मुझे ऐसा कुछ आसान करने में सक्षम होना चाहिए, लेकिन मुझे कुछ भी नहीं मिला है।

क्या कोई मुझे बता सकता है कि मुझे क्या याद आ रही है? मैंने कारखानों, फैब्रिकेटर, फिक्स्चर को देखा है, वे सभी डीबी को मारना चाहते हैं। लोग रत्नों का परीक्षण कैसे करते हैं जहां आपको केवल परीक्षण के लिए एआर ऑब्जेक्ट की आवश्यकता होती है?

उत्तर

8

में यह बारे में बात करती ऐसा लगता है कि आप NullDB की जरूरत है:

NullDB अशक्त वस्तु पैटर्न के रूप में ActiveRecord डेटाबेस एडाप्टर के लिए आवेदन किया है। यह एक डेटाबेस बैकएंड है जो डेटाबेस इंटरैक्शन को नो-ऑप्स में अनुवाद करता है। NullDB का उपयोग करने से आप अपने मॉडल व्यापार तर्क का परीक्षण कर सकते हैं - after_save हुक सहित - बिना किसी वास्तविक डेटाबेस को छूए।

+0

जो वही है जो मैं ढूंढ रहा था। धन्यवाद! –

+0

इस लाइब्रेरी का एक नकारात्मक पक्ष यह है कि यह रुपये के साथ कैसे जोड़ा जाता है। अगर आप मेरी तरफ से रुपेक –

+0

+1 का उपयोग नहीं कर रहे हैं तो कुछ ध्यान में रखना ... –

2

अन्य ने भी यही समस्या है। मेरा सामान्य लेना यूनिट परीक्षणों के लिए एक मॉकिंग लाइब्रेरी का उपयोग करना है, और कुछ कार्यात्मक लोगों को फिक्स्चर का उपयोग करके उन्हें पूरक बनाने के लिए पूरक बनाने के लिए लिखना है (जो आपको किसी भी तरह से बचना चाहिए)।

या एआर के लिए प्रतिस्थापन लाइब्रेरी का उपयोग करें जो एक ही इंटरफेस प्रदान करता है लेकिन डीबी की आवश्यकता नहीं है। मैंने कुछ समय में रेल का उपयोग नहीं किया है, लेकिन कुछ उपलब्ध थे। यह पहली बार एक डीबी का उपयोग करने जैसी समस्याओं के बिना पूरी तरह से नहीं है, क्योंकि इन पुस्तकालयों में आमतौर पर अन्य आवश्यकताएं होती हैं (जैसे वेब सर्विसेज, एलडीएपी, ...), या सिर्फ उसी रिकॉर्ड रिकॉर्ड की आवश्यकता होती है जैसे कि मैक्स करते हैं।

या इसे काट लें और केवल फिक्स्चर का उपयोग करें, लेकिन मेमोरी स्क्लाइट डीबी में केवल परीक्षणों और उचित माइग्रेशन के लिए अपनी लागत को वास्तव में छोटा बनाएं।

+0

आप एक अच्छे बिंदु बना। एक छोटा साक्लाइट डीबी एक अच्छा विकल्प होगा। –

2

हाँ, मैं कुछ समय पहले रेल 2.3 में ऐसा करना चाहता था और यह एक बड़े पैमाने पर मजाकिया सिरदर्द था। मुझे लगता है कि अब ActiveModel के साथ यह आसान है, जो आपको एक स्पष्ट इंटरफेस देता है, अगर आप अपना रोल करना चाहते हैं।

इसके अलावा, मैंने इसे स्वयं नहीं उपयोग किया है, लेकिन जोश सूसर के पास एक मणि है जो आपको किसी भी वर्ग में एआर-आश व्यवहार में मिश्रण करने देता है। ऐसा लगता है कि रूपों में सादे रूबी ऑब्जेक्ट्स का उपयोग करने की दिशा में तैयार है, लेकिन यह यूनिट परीक्षण के लिए भी उपयोगी है। informal देखें।

उन्होंने हाल ही में एक Ruby Rogues episode

+0

अनौपचारिक दिखने वास्तव में अच्छा लगता है। मैं वास्तव में कुछ और के लिए इसका उपयोग कर सकता हूं, इसे इंगित करने के लिए धन्यवाद। –

1

एक अन्य विकल्प sqlite3 एडाप्टर का उपयोग और स्मृति में डेटाबेस चलाने के लिए, और एक DatabaseCleaner का उपयोग परीक्षण के बाद रिकॉर्ड से छुटकारा पाने के लिए है।

यह दृष्टिकोण कुछ फायदे हैं:

  • आप परीक्षा में एसक्यूएल देख सकते हैं, तो वह पूछताछ अनुकूलन प्रक्रिया को सरल
  • यह करीब "वास्तविक जीवन" उदाहरण
  • है

पर दूसरी ओर, मैं कहना चाहिए यह थोड़ा जटिल होता है, क्योंकि यह थोड़ा लंबा है, लेकिन यह पुनर्गठन करने के लिए स्वतंत्र महसूस;)

यहाँ तुम क्या के लिए की जरूरत है एक संक्षिप्त विवरण है आर कि:

# in Gemfile 
gem "activerecord" #since you are dealing with activerecord 
gem "database_cleaner", :group => :test 
gem "sqlite3", :group => :test 

मैं बात रखने के लिए निम्नलिखित दृष्टिकोण का उपयोग कर रहा है, लेकिन आप का स्वागत है इसे दूसरे तरीके से करने के लिए:

# in RAILS_ROOT/test/support/active_record.rb 
require 'logger' 

ActiveRecord::Base.establish_connection(
    :adapter => "sqlite3", :database => ':memory:' 
) 

#this line will print the SQL queries right into console 
ActiveRecord::Base.logger = Logger.new(STDOUT) 

# in RAILS_ROOT/test/support/database_cleaner.rb 
require 'database_cleaner' 
DatabaseCleaner.strategy = :truncation 
# or DatabaseCleaner.strategy = :trunsaction (it is up to you) 

module OrmSetup 
    def before_setup 
    DatabaseCleaner.start 
    end 

    def after_teardown 
    DatabaseCleaner.clean 
    end 
end 

# in RAILS_ROOT/test/test_helper.rb 
... 
require File.expand_path("support/active_record", File.dirname(__FILE__)) 
require File.expand_path("support/database_cleaner", File.dirname(__FILE__)) 

class Test::Unit::TestCase 
    include OrmSetup 
end 

और अब अपने परीक्षण में आप कर सकते हैं कुछ

की तरह
require 'test_helper' 

class User < ActiveRecord::Base 
end 

class MyFancyTest < Test::Unit::TestCase 
    def setup 
    before_setup 
    end 

    def teardown 
    after_teardown 
    end 
end