2012-02-12 17 views
5

के साथ नियंत्रक का परीक्षण मेरे पास मॉडल हैं: पोस्ट और उपयोगकर्ता (डेविस)। मैं नियंत्रक पोस्ट का परीक्षण कर रहा हूँ।आरएसपीसी, डेविस, फैक्टरी गर्ल

describe "If user sign_in" do 

    before(:all){ 
    @user = Factory(:user) 
    } 

    it "should get new" do 
    sign_in @user 
    get 'new' 
    response.should be_success 
    response.should render_template('posts/new') 
    end 

    it "should create post" do 
    sign_in @user 
    post 'create', :post => Factory(:post) 
    response.should redirect_to(post_path(:post)) 
    end 
end 

लेकिन दूसरे टेस्ट में विफल रहता है:

Failure/Error: post 'create', :post => Factory(:post) ActiveRecord::RecordInvalid: Validation failed: Email has already been taken, Email has already been taken, Username has already been taken

मैं इसे कैसे ठीक कर सकता हूँ?

उत्तर

7

परीक्षणों के बीच अपने डेटाबेस को साफ करने के लिए आपको एक टूल की आवश्यकता है। क्योंकि आप एक स्वच्छ डेटाबेस के साथ प्रत्येक परीक्षण चलाने में सक्षम होना चाहिए। मैं database_cleaner का उपयोग कर रहा हूं, यह काफी प्रसिद्ध मणि है और यह वास्तव में अच्छी तरह से काम करता है। यह भी सेटअप करना आसान है। रीडमे (आरएसपीसी संबंधित) से एक उदाहरण:

RSpec.configure do |config| 

    config.before(:suite) do 
    DatabaseCleaner.strategy = :transaction 
    DatabaseCleaner.clean_with(:truncation) 
    end 

    config.before(:each) do 
    DatabaseCleaner.start 
    end 

    config.after(:each) do 
    DatabaseCleaner.clean 
    end 

end 
+3

जब मैं spec_helper में अपना कोड शामिल करता हूं। मुझे त्रुटि मिली विफलता/त्रुटि: बैकट्रैस से सक्रिय लाइन ढूंढने में असमर्थ ActiveRecord :: स्टेटमेंट इन्वालिड: SQLite3 :: SQLException: लेनदेन के भीतर लेनदेन शुरू नहीं कर सकता: लेनदेन शुरू करें – Mike

+0

आपको इसके लिए एक और मणि की आवश्यकता नहीं है। – coneybeare

+3

मैंने पाया कि SQLite अपवाद समाधान 'clean_with (: truncation)' को निकालने के लिए था और रणनीति को पूरी तरह से 'DatabaseCleaner.strategy =' truncation' – Dan

9

आपको इसके लिए एक और मणि की आवश्यकता नहीं है। फैक्टरीगर्ल ने इसके लिए गतिशील सहायकों में बनाया है। मैं इस बारे में संक्षिप्त Railscast देख रहा हूं। यहां यह एक स्निपेट है कि यह कैसे काम करता है:

FactoryGirl.define do 
    factory :user do 
    sequence(:username) { |n| "foo#{n}" } 
    password "foobar" 
    email { "#{username}@example.com" } 
+1

hmmm, सशुल्क सामग्री का लिंक ... को सबसे अधिक प्रतीत नहीं होता है उत्तर के सहायक ... – botbot

+18

यदि आप रेल डेवलपर हैं और रेलकास्ट का उपयोग नहीं कर रहे हैं, तो आप इसे गलत कर रहे हैं। – coneybeare

+0

लेकिन यदि आप एक सत्य रेल डेवलपर हैं, तो आपको पहले मुफ्त सामग्री से लिंक करना चाहिए और फिर भुगतान किए गए सुझाव का सुझाव देना चाहिए – Aleks

संबंधित मुद्दे