简体   繁体   English

使用工厂女孩与Rspec

[英]Using Factory Girl with Rspec

I have set up Rspec with a rails4 app however the tests are returning: 我已经使用rails4 app设置了Rspec,但是测试正在返回:

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

Seems like I'm including FactoryGirl incorrectly. 好像我不正确地包括FactoryGirl。 I've tried a couple of variations but I can't get it to work. 我尝试了几种变化,但我无法让它发挥作用。

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

gem 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

my 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

and in /spec/factories/users.rb 在/spec/factories/users.rb中

FactoryGirl.define do
  factory :user do |f|
    f.email "provider@example.com"
    f.password "password"
  end
end

How can i get going with factory girl? 我怎么能和工厂女孩一起去?

Given that you have included: 鉴于您已包括:

config.include FactoryGirl::Syntax::Methods

In your RSpec configure block, I'm guessing that the syntax you're looking for is: 在你的RSpec配置块中,我猜你正在寻找的语法是:

user = create(:user)

or: 要么:

user = build(:user)

To create a user using FactoryGirl: 要使用FactoryGirl创建用户:

user = FactoryGirl.create(:user)

This will use everything you defined in the factory to create the user. 这将使用您在工厂中定义的所有内容来创建用户。 You can also override any value, or specify additional values at the same time. 您还可以覆盖任何值,或同时指定其他值。 For example: 例如:

user = FactoryGirl.create(:user, username: 'username', email: 'different-email@example.com)

Alternatively you can use FactoryGirl.build(:user, ...) where you want to make use of the factory to build an instance but not actually save it to the database. 或者,您可以使用FactoryGirl.build(:user, ...) ,您可以使用工厂来构建实例,但实际上并不将其保存到数据库中。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM