2009-06-12 9 views
23

फैक्टरी गर्ल परीक्षण के लिए मॉडल के उदाहरण आसानी से बनाने के लिए रेलों में एक आसान ढांचा है।क्या फैक्टरी गर्ल जैसी ढांचा जावा के लिए मौजूद है?

Factory Girl home page से:

factory_girl आप जल्दी से अपने मॉडल से प्रत्येक के लिए प्रोटोटाइप को परिभाषित करने और गुण है कि हाथ में परीक्षण के लिए महत्वपूर्ण हैं के साथ उदाहरण के लिए पूछ सकते हैं।

(मुख पृष्ठ से भी) एक उदाहरण:

Factory.sequence :email do |n| 
    "somebody#{n}@example.com" 
end 

# Let's define a factory for the User model. The class name is guessed from the 
# factory name. 
Factory.define :user do |f| 
    # These properties are set statically, and are evaluated when the factory is 
    # defined. 
    f.first_name 'John' 
    f.last_name 'Doe' 
    f.admin  false 
    # This property is set "lazily." The block will be called whenever an 
    # instance is generated, and the return value of the block is used as the 
    # value for the attribute. 
    f.email  { Factory.next(:email) } 
end 

अगर मैं एक उपयोगकर्ता की जरूरत है एक बस फोन कर सकते हैं

test_user = Factory(:user, :admin => true) 

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

मुझे लगता है कि जावा के लिए कुछ ऐसा लागू करना बहुत आसान होना चाहिए, लेकिन मैं पहिया को फिर से शुरू नहीं करना चाहता हूं।

पीएस: मुझे जेएमॉक और इज़ीमोक दोनों के बारे में पता है, हालांकि मैं यहां एक मॉकिंग फ्रेमवर्क के बारे में बात नहीं कर रहा हूं।

+0

क्या आप हमें फैक्टरीगर्ल का उदाहरण दे सकते हैं, हमें बिना किसी और के बारे में पढ़ना है? – skaffman

+1

पायथन के लिए एक था जब तक कि उन ढांचे के अधिकार संघों ने रास्ते में प्रवेश शुरू नहीं किया! –

+0

बीनमोदर https://github.com/keepcosmos/beanmother वह है जो आप चाहते हैं। –

उत्तर

5

ऐसा करने के लिए एक संभावित लाइब्रेरी Usurper है।

हालांकि, यदि आप ऑब्जेक्ट्स के गुणों को निर्दिष्ट करना चाहते हैं, तो जावा की स्थैतिक टाइपिंग फ्रेमवर्क को व्यर्थ बनाती है। आपको संपत्ति नामों को तारों के रूप में निर्दिष्ट करना होगा ताकि ढांचा प्रतिबिंब या जावा बीन आत्मनिरीक्षण का उपयोग करके संपत्ति एक्सेसर्स को देख सके। इससे रिफैक्टरिंग अधिक कठिन हो जाएगी।

ऑब्जेक्ट्स को नए बनाने और उनकी विधियों को कॉल करना बहुत आसान है। यदि आप परीक्षणों में बॉयलरप्लेट कोड से बचना चाहते हैं, तो Test Data Builder पैटर्न मदद कर सकता है।

+0

अच्छी तरह से कहा - अगर यह मेरा सवाल था तो मैं यह जवाब स्वीकार करूंगा। :) – cwash

+1

[इसे आसान बनाएं] (http://code.google.com/p/make-it-easy/) किसी भी तरह से समान है, क्योंकि यह टेस्ट डेटा बिल्डर्स को लागू करने में मदद करता है, जो प्रत्येक प्रॉपर्टी के लिए डिफ़ॉल्ट मान परिभाषित करता है। – Augusto

+0

Usurper लिंक टूटा हुआ है, प्रोजेक्ट मृत लगता है। –

-1

यदि आपके मॉडल ऑब्जेक्ट्स सरल हैं, तो उन्हें बनाने के लिए ढांचे का उपयोग करने का कोई कारण नहीं है, बस बस 'नया' ऑपरेटर का उपयोग करें। (वसंत परीक्षण परिदृश्य में भी आप उपयोग कर सकते हैं) आप जटिल मॉडल (जटिल रिश्ते) है तो आप उन्हें एक साथ बाँध के लिए वसंत का उपयोग कर सकते

  • लेकिन यह, डेटा वस्तुओं के लिए बस है अगर आप वस्तुओं instantiating के बारे में बात कर रहे हैं जो कुछ कर रहे हैं, वास्तविक घटनाओं का उपयोग करने के बजाय बाहरी संबंधों को नकल/चिपकाने की सिफारिश की गई है।
+0

"अपने मॉडल वस्तुओं सरल कर रहे हैं" वे :-) नहीं कर रहे हैं "आप वसंत का उपयोग उन्हें एक साथ बाध्य करने के लिए कर सकते हैं" आप उस पर थोड़ा eloborate कर सकते हैं? मान लें कि मेरे पास मूवी मॉडल है, मूवी में कई स्ट्रीम हैं, प्रत्येक स्ट्रीम में एक होस्ट है। अब मैं परीक्षण उद्देश्यों के लिए 25 फिल्में चाहूंगा। वसंत मेरी मदद कैसे करता है? अगर मुझे अपने खोजक मेहोड्स का परीक्षण करने के लिए डेटाबेस में 25 फिल्में चाहिए तो क्या होगा? – KaptajnKold

+0

मैं किसी भी जटिलता की वस्तुओं के लिए 'नए' कीवर्ड का उपयोग करके इन्हें बनाने की कोशिश करने की अनुशंसा नहीं करता। कम से कम आप ऑब्जेक्ट मदर पैटर्न का उपयोग करना चाहते हैं (अनिवार्य रूप से प्रारंभिक वस्तुओं के लिए स्थैतिक फैक्ट्री विधियां बनाएं) लेकिन आदर्श रूप से आप बिल्डर पैटर्न का उपयोग करेंगे क्योंकि यह आपको एक दानेदार स्तर पर गुणों को ओवरराइड करने के लिए साइन डेफॉल्ट और एक तंत्र प्रदान करता है। – cwash

+0

मुझे लगता है कि आप यहां बहुत सारी चीजें मिश्रित कर रहे हैं। - डेटाबेस कोड परीक्षण के लिए, आपके पास डीबीयूनीट है उदाहरण के लिए जो आपको डेटाबेस प्री/पोस्ट टेस्ट प्रबंधित करने में मदद करता है। - एक यूनिट परीक्षण के लिए आपको 25 फिल्मों की आवश्यकता नहीं होगी, 2 अयस्क 3 कक्षा परीक्षण के लिए पर्याप्त हैं। मेरी राय है ... अपने परीक्षणों को सरल बनाने का प्रयास करें, और आप देखेंगे कि आपको परीक्षण के लिए इनपुट बनाने के लिए ढांचे की आवश्यकता नहीं है। – silmx

2
  1. मैं समझता हूँ कि यह हर किसी के लिए नहीं है, लेकिन आप अपने जावा कोड के खिलाफ रूबी परीक्षण कोड लिख सकते हैं। (JTestR)
  2. जावा में ऐसा करने का पसंदीदा तरीका Test Data Builder पैटर्न का उपयोग कर रहा है। मैं तर्क दूंगा कि यह दृष्टिकोण वास्तव में एक ढांचे या बाहरी निर्भरता की जटिलता को पेश करने की गारंटी नहीं देता है। मैं सिर्फ यह नहीं देखता कि आप ढांचे का उपयोग करके बहुत कम कैसे निर्दिष्ट कर सकते हैं और इससे कुछ और प्राप्त कर सकते हैं ... बिल्डर सिंटैक्स अनिवार्य रूप से आपके फैक्टरीगर्ल वाक्यविन्यास के बराबर है। (कोई मुझ पर नहीं तो समझाने के लिए स्वतंत्र लग रहा है!)
1

मैं जानता हूँ कि यह वास्तव में नहीं है आप के लिए ...

क्या देख रहे मैं पिछले कि प्रतिबिंब का उपयोग कर एक को भरने के लिए मैं कुछ कोड लिखा है सेम मूल्य। मूल विचार सभी सेटर्स को ढूंढना और प्रत्येक को डमी मान के साथ कॉल करना है। मेरा संस्करण फ़ील्ड सेट नाम के नाम के रूप में सभी स्ट्रिंग्स को "नाम" के नाम से बुलाया जाएगा, फिर सभी इन्ट्स को 1 के रूप में सेट करें, बूलियन को सत्य के रूप में सेट करें

मैंने ऑब्जेक्ट मां के समान पैटर्न के साथ संयोजन में इसका उपयोग किया और टेस्ट डेटा बिल्डर।

यह परीक्षण डेटा के लिए एक अच्छी शुरुआत प्रदान करता है और किसी भी फ़ील्ड के लिए आवश्यक मूल्यों को स्पष्ट रूप से परीक्षण के हिस्से के रूप में सेट किया जा सकता है।

उम्मीद है कि इससे मदद मिलती है।

19

मैंने फैक्टरी गर्ल के जावा समकक्ष की भी तलाश की, लेकिन ऐसा कुछ भी नहीं मिला। इसके बजाय, मैंने खरोंच से एक समाधान बनाया। जावा में मॉडल बनाने के लिए एक कारखाना: Model Citizen

फैक्टरी लड़की से प्रेरित होकर, यह एक मॉडल के लिए डिफ़ॉल्ट सेट करने के लिए क्षेत्र एनोटेशन का उपयोग करता है, a simple example from the wiki:

@Blueprint(Car.class) 
public class CarBlueprint { 

    @Default 
    String make = "car make"; 

    @Default 
    String manufacturer = "car manufacturer"; 

    @Default 
    Integer mileage = 100; 

    @Default 
    Map status = new HashMap(); 
} 

इस कार मॉडल के लिए खाका होगा। की तुलना में नए उदाहरणों बनाया जा सकता है यह, ModelFactory में पंजीकृत किया गया है इस प्रकार है:

ModelFactory modelFactory = new ModelFactory(); 
modelFactory.registerBlueprint(CarBlueprint.class); 
Car car = modelFactory.createModel(Car.class); 

आप कक्षा के बजाय कार का एक उदाहरण में गुजर और मूल्यों की स्थापना द्वारा कार मॉडल के मूल्यों को भी पार कर सकते हैं के रूप में की जरूरत:

Car car = new Car(); 
car.setMake("mustang"); 
car = modelFactory.createModel(car); 

wiki अधिक जटिल उदाहरण (such as using @Mapped) और कुछ और घंटियां और सीटियां के लिए विवरण है।

1

मैं यहां एक ही प्रश्न के साथ पहुंचा और मेरे एकीकरण परीक्षण के लिए डेटा जनरेशन टूल के लिए आवश्यक था। मैंने ग्रोवी के साथ चुनौती स्वीकार करने का फैसला किया, जो इसकी कॉम्पैक्टनेस और power assert की वजह से परीक्षणों की पसंद की मेरी भाषा है।

मैंने अभी तक एक छोटा सा सहायक https://gist.github.com/pgaertig/9502960 लिखा है जिसे फैक्टरीग्रिल कहा जाता है;) जो आपको नीचे की तरह डेटा स्क्रिप्ट लिखने की अनुमति देता है।

insert('MyTable', ID: 1, CREATED_AT: new Date(), NAME: 'Example text') 

ऊपर के बराबर है:

INSERT INTO MyTable(ID, CREATED_AT, NAME) VALUES (1, ..current date here.., 'Example text') 

आप ग्रूवी के साथ और अधिक कर सकते हैं:

import org.apache.commons.lang3.RandomStringUtils; 

for (i in 0..9) { 
    insert('USERS', CREATED_AT: new Date(), EMAIL: "test${i}@mydomain.com", 
        SALT: RandomStringUtils.randomAlphanumeric(32)); 
} 

load(new File('usersettings.groovy').text) //script nesting etc 

यह कारखाना नहीं है वास्तव में क्योंकि कारखानों काफी सीधे ग्रूवी में आगे map constructor या expandos साथ कर रहे हैं ।

फैक्टरीगर्ल से संदर्भ और अन्य सामान वर्तमान में उपलब्ध नहीं है क्योंकि ऊपर केवल ~ 30LOC के साथ हासिल किया जाता है। हालांकि अगर मेरे समाधान में दिलचस्पी है तो मैं गितूब पर एक समर्पित परियोजना जोड़ूंगा।