2014-05-22 21 views
5

Tôi đã thiết lập RSpec với một ứng dụng rails4 tuy nhiên các cuộc thử nghiệm đang quay trở lại:Sử dụng Factory Girl với RSpec

Failure/Error: user = Factory(:user) 
    NoMethodError: 
     undefined method `Factory' for #<RSpec::Core::ExampleGroup::Nested_4::Nested_1:0x007fa08c0d8a98> 

Có vẻ như tôi bao gồm FactoryGirl không chính xác. Tôi đã thử một vài biến thể nhưng tôi không thể làm cho nó hoạt động.

My Spec Helper:

# This file is copied to spec/ when you run 'rails generate rspec:install' 
ENV["RAILS_ENV"] ||= 'test' 
require File.expand_path("../../config/environment", __FILE__) 
require 'rspec/rails' 
require 'rspec/autorun' 
require 'factory_girl_rails' 

# Requires supporting ruby files with custom matchers and macros, etc, 
# in spec/support/ and its subdirectories. 
Dir[Rails.root.join("spec/support/**/*.rb")].each { |f| require f } 


# Checks for pending migrations before tests are run. 
# If you are not using ActiveRecord, you can remove this line. 
ActiveRecord::Migration.check_pending! if defined?(ActiveRecord::Migration) 

RSpec.configure do |config| 
    # ## Mock Framework 
    # 
    # If you prefer to use mocha, flexmock or RR, uncomment the appropriate line: 
    # 
    # config.mock_with :mocha 
    # config.mock_with :flexmock 
    # config.mock_with :rr 

    # Remove this line if you're not using ActiveRecord or ActiveRecord fixtures 
    config.fixture_path = "#{::Rails.root}/spec/fixtures" 

    # If you're not using ActiveRecord, or you'd prefer not to run each of your 
    # examples within a transaction, remove the following line or assign false 
    # instead of true. 
    config.use_transactional_fixtures = true 

    # If true, the base class of anonymous controllers will be inferred 
    # automatically. This will be the default behavior in future versions of 
    # rspec-rails. 
    config.infer_base_class_for_anonymous_controllers = false 

    # Run specs in random order to surface order dependencies. If you find an 
    # order dependency and want to debug it, you can fix the order by providing 
    # the seed, which is printed after each run. 
    #  --seed 1234 
    config.order = "random" 
    config.include Capybara::DSL, :type => :request 
    config.include FactoryGirl::Syntax::Methods 
end 

đá quý file:

group :development, :test do 
    gem 'rspec-rails', '~> 2.0' 
    gem 'factory_girl_rails', :require => false # as per sugestion on SO. Without the require false also fails 
    gem "capybara" 
end 

tôi spec:

require 'spec_helper' 

describe "Create Event" do 
    describe "Log in and create an event" do 
    it "Allows creation of individual events" do 
     user = Factory(:user) 
     visit "/" 
    end 
    end 
end 

và trong /spec/factories/users.rb

FactoryGirl.define do 
    factory :user do |f| 
    f.email "[email protected]" 
    f.password "password" 
    end 
end 

Làm thế nào tôi có thể đi với cô gái nhà máy?

Trả lời

4

Để tạo một người dùng sử dụng FactoryGirl:

user = FactoryGirl.create(:user) 

này sẽ sử dụng tất cả mọi thứ bạn đã định nghĩa trong nhà máy để tạo người dùng. Bạn cũng có thể ghi đè bất kỳ giá trị nào hoặc chỉ định các giá trị bổ sung cùng một lúc. Ví dụ:

user = FactoryGirl.create(:user, username: 'username', email: '[email protected]) 

Hoặc bạn có thể sử dụng nhà máy để tạo cá thể nhưng không thực sự lưu nó vào cơ sở dữ liệu.

+1

Ah, vâng. Tôi đã theo dõi các diễn viên đường ray và như ý kiến ​​chỉ ra cú pháp đã thay đổi một chút. cảm ơn Graeme. http://railscasts.com/episodes/275-how-i-test?view=comments#comment_158161 – Will

5

Cho rằng bạn đã bao gồm:

config.include FactoryGirl::Syntax::Methods 

Trong RSpec cấu hình khối của bạn, tôi đoán rằng cú pháp bạn đang tìm kiếm là:

user = create(:user) 

hay:

user = build(:user) 
+0

Gọn gàng. Được sử dụng FactoryGirl cho lứa tuổi và tôi không biết về cú pháp ngắn hơn này. –

+0

Điều này thật tuyệt. Tôi đã không cố gắng cho điều đó nhưng tôi sẽ sử dụng nó từ bây giờ. cảm ơn. (xấu hổ tôi không thể đánh dấu cả hai câu trả lời) – Will

+0

'user = build (: user)' # Trả về cá thể người dùng chưa được lưu 'user = create (: user)' # Trả về cá thể Người dùng đã lưu – FutoRicky

Các vấn đề liên quan