2016-07-03 23 views
2

Ich lerne Rubin auf Schienen, aber ich habe ein Problem, das ich selbst nicht lösen konnte. Kann mir irgendjemand helfen?rspec-rails + capybara NoMethodError: undefinierte Methode `create '

wenn ich laufe: Bündel exec rspec spec/models/user_spec.rb, habe ich diesen Fehler:

Failure/Error: @user = create(:user) NoMethodError: 
     undefined method `create' for #<RSpec::ExampleGroups::User::PropertiesShouldNotNil:0xb807450> 
    # ./spec/models/user_spec.rb:6:in `block (3 levels) in <top (required)>' 

Gemfile:

# Bundle edge Rails instead: gem 'rails', github: 'rails/rails' 
gem 'rails', '5.0.0.rc2' 
# Use mysql as the database for Active Record 
gem 'mysql2' 
# Use SCSS for stylesheets 
gem 'sass-rails', '~> 5.0' 
# Use Uglifier as compressor for JavaScript assets 
gem 'uglifier', '>= 1.3.0' 
# Use CoffeeScript for .coffee assets and views 
gem 'coffee-rails', '~> 4.1.0' 
# See https://github.com/rails/execjs#readme for more supported runtimes 
# gem 'therubyracer', platforms: :ruby 
# Use jquery as the JavaScript library 
gem 'jquery-rails', '~> 2.3.0' 
# Turbolinks makes following links in your web application faster. Read more: https://github.com/rails/turbolinks 
gem 'turbolinks' 
# Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder 
gem 'jbuilder', '~> 2.0' 
# bundle exec rake doc:rails generates the API under doc/api. 
gem 'sdoc', '~> 0.4.0', group: :doc 
gem 'alipay', '~> 0.10.0' #支付宝接口 
gem 'capistrano-rails', :group => :development 
gem 'capistrano-passenger', :group => :development 
# Use ActiveModel has_secure_password 
# gem 'bcrypt', '~> 3.1.7' 
# Use Unicorn as the app server 
# gem 'unicorn' 
# Use Capistrano for deployment 
# gem 'capistrano-rails', group: :development 
group :development, :test do 
    # Call 'byebug' anywhere in the code to stop execution and get a debugger console 
    gem 'byebug' 
    # Access an IRB console on exception pages or by using <%= console %> in views 
    #gem 'web-console', '~> 2.0' 
    # Spring speeds up development by keeping your application running in the background. Read more: https://github.com/rails/spring 
    gem 'spring' 
    gem 'rspec-rails' 
    gem "capybara" 
end 
group :development do 
    gem 'web-console', group: :development 
end 

spec/rails_helper.rb:

ENV["RAILS_ENV"] ||= 'test' 
require 'spec_helper' 
require File.expand_path("../../config/environment", __FILE__) 
require 'rspec/rails' 
require 'capybara/rails' 
require 'capybara/rspec' 

ActiveRecord::Migration.maintain_test_schema! 

RSpec.configure do |config| 

    config.fixture_path = "#{::Rails.root}/spec/fixtures" 

    config.use_transactional_fixtures = true 

    config.infer_spec_type_from_file_location! 
end 

App/models/user.rb

app/models/user.rb 
    has_many :recipients 
end 

spec/models/user_spec.rb:

require 'rails_helper' 

RSpec.describe User, type: :model do 
    context "properties should not nil" do 
    before do 
     @user = create(:user) 
    end 

    subject{ @user } 

    it { should respond_to(:name) } 
    it { should respond_to(:passwd) } 
    end 
end 

Antwort

0

Dieser Fehler ist, weil die create Methode, die Sie in der Regel zu nennen versuchen, ist in der FactoryGirl Klasse definiert. FactoryGirl ist ein Ruby-Juwel, mit dem Sie benutzerdefinierte Factories definieren können, um Ihre anwendungsspezifischen Modelle zu instanziieren.

Da Sie diesen Edelstein vielleicht in Ihre Rails App integrieren müssen, schlage ich vor, dass Sie die factory_girl_rails gem verwenden. Einfach das Juwel Erklärung in die :test Gruppe Ihrer Gemfile, wie fügen Sie wie folgt vor:

group :development, :test do 
    # Here go other gem declarations... 
    gem 'factory_girl_rails' 
end 
Sobald Sie dieses Juwel in Ihrem Projekt aufgenommen haben, müssen Sie die Fabriken für Ihre Modelle (in diese definieren, (Ihr User Modell), um anzugeben, wie Ihre Testinstanzen erstellt oder erstellt werden sollen. Ich empfehle Ihnen, dieses grundlegende documentation zu lesen, wie man Fabriken mit FactoryGirl definiert (ich las dieses Dokument immer und immer wieder).

Im Voraus könnte ich Ihnen sagen, dass die Fabriken normalerweise unter dem Ordner spec/factories definiert sind (in Fällen wie diesem, dass Sie RSpec verwenden) und eine gemeinsame Struktur haben. In diesem Fall Ihre User Fabrik würde in einer Datei wie spec/Fabriken/user.rb und sein wie definiert werden:

FactoryGirl.define do 
    factory :user do 
    # Here you assign values to the different attributes, like: 
    # username "username" 
    # password "pass" 
    # ... 
    end 
end 

ich die faker gem mit FactoryGirl viel verwenden, weil es mir zufälligen Werten erstellen kann für Namen, Telefonnummern, E-Mails usw. in einer Weise, die immer anders sind, aber Sinn ergeben. Sehen Sie sich die Dokumentation an, falls Sie daran interessiert sind.

Hoffe, dass diese Ihnen helfen können, Ihr Problem zu lösen!

+0

Danke Daniel Ruiz, deine Antwort hilft mir mein Problem zu lösen. – Lorbin

Verwandte Themen