2011-05-05 4 views
5

के खिलाफ परीक्षण शायद यह ऐसा कुछ नहीं है जिसके खिलाफ परीक्षण किया जाना चाहिए, लेकिन मैं सीख रहा हूं इसलिए मुझे लगता है कि अधिकतम परीक्षण करने में गलत नहीं है।सामूहिक असाइनमेंट

मेरे पास कई परीक्षण हैं जो सभी एक को छोड़कर अपेक्षित परिणाम उत्पन्न करते हैं। मुझे इसके आसपास काम करने का एक तरीका मिला लेकिन मुझे आश्चर्य हुआ कि सही विधि क्या होगी।

जब मैं रेल कंसोल में बचत का परीक्षण करता हूं तो यह व्यवस्थापक फ़ील्ड को पैराम्स हैश से सहेजता नहीं है, जो मुझे उम्मीद है। जब मैं एक कारखाने के साथ निर्माण करता हूं तो इसे बचाता हूं, वैधता पास/विफल होती है। जब मैं बड़े पैमाने पर असाइनमेंट के खिलाफ सुरक्षा के लिए परीक्षण करता हूं तो परीक्षण विफल रहता है (क्योंकि यह व्यवस्थापक क्षेत्र को सेट करता है जब मैं इसे उम्मीद नहीं करता)

कोई विचार, सुझाव या चिंताएं?

धन्यवाद

मॉडल:

class User ... 
    #id, name, email, admin(int) 
    attr_accesible :name, email 
    ... 
end 

user_spec

it "should not have an admin after a mass save" do 
    user = Factory.build(:user) 
    user.save 
    user.admin.should be_nil #its not nil, its 0  
end 

कारखानों

Factory.define :user do |f| 
    f.name "rec_acro" 
    f.email "[email protected]" 
    f.admin 0 
end 

उत्तर

13

आप एक संक्षिप्त बड़े पैमाने पर एक पाने के लिए rspec के शीर्ष पर Shoulda उपयोग कर सकते हैं ssignment कल्पना:

describe User do 
    it { should_not allow_mass_assignment_of(:admin) } 
end 
+0

आप चाहिये उपयोग करने के लिए RSpec उपयोग करने की आवश्यकता नहीं है: यह मूल रूप से की तरह कुछ नहीं करता है। –

+5

सही, लेकिन चूंकि ओपी पहले से ही आरएसपीईसी का उपयोग कर रहा है, इसलिए मैं बस यह इंगित कर रहा था कि उन्हें एक साथ इस्तेमाल किया जा सकता है। –

+1

क्या आपको लगता है कि केवल वह व्यक्ति जो कभी भी इस प्रश्न को पढ़ेगा और उत्तर की तलाश में उत्तर देगा ओपी? मैं इसे दूसरों के लिए नोट कर रहा था। –

2

फैक्टरी गर्ल (हक तो) बड़े पैमाने पर काम का उपयोग नहीं करता वस्तुओं उत्पन्न करने के लिए। उत्पन्न उपयोगकर्ता ऑब्जेक्ट को कारखाने से लें और उसके बाद केवल बड़े पैमाने पर असाइनमेंट करने का प्रयास करें, यद्यपि केवल व्यवस्थापक पैरामीटर के साथ।

3

फैक्टरीगर्ल फैक्टरी परिभाषा में प्रत्येक विशेषता लेगा और इसे व्यक्तिगत रूप से सेट करेगा। तो अपने परीक्षण वास्तव में FactoryGirl कोड (build.rb) से बड़े पैमाने पर काम

परीक्षण नहीं होता है: (। this देखें यदि आप और अधिक कोड FactoryGirl मणि के लिए पढ़ने में रुचि रखते हैं)

def set(attribute, value) 
    @instance.send(:"#{attribute}=", value) 
    end 

जैसा कि एक और उत्तर सुझाव दिया गया है, आप allow_mass_assignment_of matcher को नियोजित करने के लिए कंधे का उपयोग कर सकते हैं। (Matchers के बारे में के बारे में होना चाहिए Here's a little अधिक।)

it "allows mass assignment of :title" do 
    accessible = Post.accessible_attributes.include?('title') || 
      !Post.protected_attributes.include?('title') 
    accessible.should be_true 
end