我的控制器规范失败,因为Factory Girl似乎正在创建非唯一用户,即使我对需要唯一的用户属性进行排序.
错误
1) TopicsController POST #create when topic is invalid should render new
Failure/Error: let(:invalid_topic) {Factory.build :invalid_topic}
ActiveRecord::RecordInvalid:Validation failed: Email has already been taken, Username has already been taken
2) TopicsController POST #create when topic is valid should redirect to show
Failure/Error: let(:valid_topic) {Factory.build :topic}
ActiveRecord::RecordInvalid:
Validation failed: Email has already been taken, Username has already been taken
Run Code Online (Sandbox Code Playgroud)
控制器规格(RSpec)
describe "POST #create" do
let(:valid_topic) {Factory.build :topic}
let(:invalid_topic) {Factory.build :invalid_topic}
context "when topic is invalid" do
it "should render new" …Run Code Online (Sandbox Code Playgroud) 我刚刚将载波图像的验证添加到模型中,现在测试运行速度非常慢.我怎样才能加快这个过程?我觉得必须有更好的方法.
我一直在没有验证的情况下运行,并且过去能够在大约140秒内完成我的rspec测试,但是因为我现在验证了:display_pic我必须将实际文件上传添加到我的项目工厂.这已经增加到240秒!140已经在沉重的一面,这只是疯了.
这就是carrierwave github页面建议设置Factory Girl的方法:
FactoryGirl.define do
factory :project do
display_pic { File.open(File.join(Rails.root, 'spec', 'support', 'projects', 'display_pics', 'test.jpg')) }
end
end
Run Code Online (Sandbox Code Playgroud)
我做了上面的test.jpg只是一个空文本文件,所以它本质上尽可能小.
我还遵循了carrierwave建议来设置测试:
CarrierWave.configure do |config|
config.storage = :file
config.enable_processing = false
end
Run Code Online (Sandbox Code Playgroud) 我们有两个共享相同数据库和模型的Web应用程序.为了保持DRY,我们创建了一个包含所有模型的引擎.此引擎通过Gemfile包含在相应的应用程序中.我们确实在引擎内部使用RSpec和FactoryGirl进行了测试.
现在我们正在尝试编写集成测试,我们希望使用引擎中的工厂而无需复制或符号链接.有没有办法以编程方式实现这一目标?
我有许多模型可以是authorable(有一个作者字段)和/或tenancyable(有一个租户字段).所以,我写了两个问题.
问题出在测试中.我曾使用该shared_examples_for块为关注点编写测试,并将它们包含在我的模型测试中.无论如何,要做到这一点,我有几个特征和后块,例如:
after(:build) do |authorable|
authorable.author = build(:user, tenant: authorable.tenant)
end
trait :no_author do
after(:build) do |authorable|
authorable.author = nil
end
end
trait :no_tenant do
tenant nil
end
Run Code Online (Sandbox Code Playgroud)
在所有可租赁和可授权的模型的工厂中,这段代码应该是相同的.
我没有找到任何办法做到这一点.可能吗?
#rspec test code
@room = FactoryGirl.build(:room)
#factory definition
factory :room do
length {10}
width {20}
end
#code implementation
class Room
attr_accessor :length, :width
def initialize(length,width)
@length = length
@width = width
end
end
Run Code Online (Sandbox Code Playgroud)
尝试构建@room时,运行rspec会导致此错误
ArgumentError:参数数量错误(0表示2)
我正试图让FactoryGirl为我生成一些名字,但序列似乎没有增加.
# spec/factories/vessel.rb
require 'factory_girl'
FactoryGirl.define do
sequence :vessel_name do |n|
"TK42#{n}"
end
factory :vessel do
name FactoryGirl.generate(:vessel_name)
vessel_type 'fermenter'
volume_scalar 100.0
volume_units 'bbl'
end
end
Run Code Online (Sandbox Code Playgroud)
# spec/models/vessel_spec.rb
require 'spec_helper'
describe Vessel do
context 'working in the factory' do
it 'makes a valid vessel' do
vessel = FactoryGirl.create(:vessel)
vessel.should be_valid, "Invalid vessel #{vessel.valid? || vessel.errors.messages.inspect}"
end
it 'makes another valid vessel' do
vessel = FactoryGirl.create(:vessel)
vessel.should be_valid, "Invalid vessel #{vessel.valid? || vessel.errors.messages.inspect}"
end
end
end
Run Code Online (Sandbox Code Playgroud)
规格输出是
Vessel
working in the …Run Code Online (Sandbox Code Playgroud) 我已经构建了一些精心制作的FactoryGirl工厂定义来测试Rails项目,为此它们运行良好.
我现在想用脚本(Ruby,Rake,等等......)使用相同的定义,用大量有效的,正确关联的记录来填充Rails开发数据库.
我确信这是一项常见任务,但无法找到有用的参考资料.
什么是最佳做法?如何进行?
说工厂在spec/factories.rb.接下来是什么?谢谢.
更新
还在苦苦挣扎.试过这个rake任务.
require 'factory_girl'
require 'spec/factories'
namespace :db do
desc "Fill database with trial data"
task :populate => :environment do
Rake::Task['db:reset'].invoke
50.times do |n|
# Make a consistent set of related records.
team = FactoryGirl.create(:team, :completed)
team.members << FactoryGirl.create(:member)
FactoryGirl.create(:design, :team => team)
end
end
end
Run Code Online (Sandbox Code Playgroud)
唉,这找不到我的factories.rb:
rake aborted!
cannot load such file -- spec/factories
Run Code Online (Sandbox Code Playgroud)
在其他任何地方,项目根相对要求路径工作正常.什么是秘密握手?
有以下工厂:
factory :car do
name 'Some car'
engine_value 1.6
color '#ff0000'
car_type
engine_type
transmission
drive_type
material
end
Run Code Online (Sandbox Code Playgroud)
如你所见,有很多相关的对象.但是代码
attributes_for(:car)
Run Code Online (Sandbox Code Playgroud)
只生成:name=>"Some car", :engine_value=>1.6, :color=>"#ff0000"}哈希.我需要获得具有所有属性的哈希.我该怎么做?谢谢.
如果我添加:
config.include FactoryGirl::Syntax::Methods
Run Code Online (Sandbox Code Playgroud)
下
RSpec.configure do |config|
Run Code Online (Sandbox Code Playgroud)
并运行rspec,我看到这个错误:
/Users/perry_mac/rails_projects/mymri/spec/spec_helper.rb:21:in"block in":未初始化的常量FactoryGirl(NameError)
我的gemfile.lock可以在这个pastebin中看到
我的gemfile可以在这个pastebin中看到
如果我省略Rspec.comfigure语句,我的测试都运行正常.我想使用缩写语法,但我不确定我在这里做错了什么.
跟随Ben Walker的(惊人的)让我们用Rails构建Instagram,特别是BDD版本.教程使用FactoryGirl.我通过一些测试得到以下错误:
精简版
Failure/Error: post = create( :post, user_id = user.id )<br>
ArgumentError:<br>
Trait not registered: 1
Run Code Online (Sandbox Code Playgroud)
我不能让Ben甚至用我的repo克隆重新创建bug ,而我在Stack Overflow中找不到任何"trait not registered"问题.
这是我的第一个问题,所以如果我在这方面做错了,请告诉我.在此先感谢您的帮助!
代码选择:
投机/ factories.rb
FactoryGirl.define do
factory :post do
caption "nofilter"
image Rack::Test::UploadedFile.new(Rails.root + 'spec/files/images/coffee.jpg', 'image/jpg')
user_id 1
end
factory :user do
email 'fancyfrank@gmail.com'
user_name 'Arnie'
password 'illbeback'
id 1
end
end
Run Code Online (Sandbox Code Playgroud)
规格/功能/ viewing_posts_spec.rb
require 'spec_helper'
feature 'viewing individual posts' do
background do
user = create :user
post = create( :post, user_id …Run Code Online (Sandbox Code Playgroud)