簡體   English   中英

在Rails 5中設置工廠女孩。文檔似乎省略了重要的一步

[英]Setting up factory girl in Rails 5. Docs seem to leave out an important step

我究竟做錯了什么? 在文檔中似乎沒有地方說要放:

require 'factory_girl_rails'
require 'support/factory_girl'

在你的rails_helper中。

這是我沒有兩行的設置:

的Gemfile:

source 'https://rubygems.org'

gem 'rails', '>= 5.0.0.beta3', '< 5.1'
gem 'sqlite3'
gem 'puma'
gem 'sass-rails', '~> 5.0'
gem 'uglifier', '>= 1.3.0'
gem 'coffee-rails', '~> 4.1.0'
gem 'jquery-rails'
gem 'turbolinks', '~> 5.x'
gem 'jbuilder', '~> 2.0'
gem 'carrierwave'
gem 'carrierwave_direct'
gem "mini_magick"

group :development, :test do
  gem 'pry'
  gem 'rspec-rails', '~> 3.0'
  gem 'factory_girl_rails'
  gem 'database_cleaner', '~> 1.5', '>= 1.5.1'
end

group :development do
  gem 'web-console', '~> 3.0'
  gem 'listen', '~> 3.0.5'
  gem 'spring'
  gem 'spring-watcher-listen', '~> 2.0.0'
end

gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby]

用戶模型:

class User < ApplicationRecord
  has_many :images
end

Factories.rb文件內部規格:

FactoryGirl.define do
  factory :user do
    sequence(:name) { |n| "jeff#{n}" }
    after(:build) do |user, eval|
      user.images << build(:image)
    end
  end


  factory :image do
    avatar File.open(File.join(Rails.root, '/spec/support/images/blueapron.jpg'))
  end
end

這是我的規格/型號/user_spec.rb:

describe User do

  before(:each) do
    @user = create(:user)
  end
  describe "images" do
    it "should have multiple images" do
        require 'pry' ; binding.pry

        @user.images.create({document_file:File.open(File.join(Rails.root, '/spec/fixtures/files/image.png'))})
        @user.images.create({document_file:File.open(File.join(Rails.root, '/spec/fixtures/files/image.png'))})

        @user.images.length.should eq(3)
    end
  end
end

當我運行測試時:

Failures:

  1) User images should have multiple images
     Failure/Error: @user = create(:user)
     NoMethodError:
       undefined method `create' for #<RSpec::ExampleGroups::User::Images:0x007fea80756f08>
     # ./spec/models/user_spec.rb:4:in `block (2 levels) in <top (required)>'

之后,將這兩行包含在我的rails_helper中:

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

突然它現在起作用了:

 before(:each) do
     4:     @user = create(:user)
     5:   end
     6:   describe "images" do
     7:     it "should have multiple images" do
 =>  8:         require 'pry' ; binding.pry
     9:
    10:         @user.images.create({document_file:File.open(File.join(Rails.root, '/spec/fixtures/files/image.png'))})
    11:         @user.images.create({document_file:File.open(File.join(Rails.root, '/spec/fixtures/files/image.png'))})
    12:
    13:         @user.images.length.should eq(3)

[1] pry(#<RSpec::ExampleGroups::User::Images>)> @user
=> #<User:0x007f86e86cbcd8 id: 1, name: "jeff2", created_at: Thu, 17 Mar 2016 04:39:42 UTC +00:00, updated_at: Thu, 17 Mar 2016 04:39:42 UTC +00:00>

我甚至不記得我在哪里發現了這兩條線。 是否在文檔中包含這些行?

在工廠中,您使用build

after(:build) do |user, eval|
  user.images << build(:image)
end

在您的規范中,您可以使用create

describe User do
  before(:each) do
    @user = create(:user)
  end

您必須使用相同的鈎子,我建議您:

  • 使用build而不是在before(:each)塊中創建和保存記錄
  • 在工廠中包含for ((create)的另一個鈎子並創建(不構建)圖像

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM