无法使用Fabrication-gem和Mongoid制作许多物品

时间:2015-04-12 17:06:55

标签: ruby-on-rails rspec mongoid database-cleaner fabrication-gem

我使用Fabrication-gem gem,在RSpec测试中使用DatabaseCleaner和Mongoid ORM。这是我的脚本:

规格/支持/ database_cleaner.rb

RSpec.configure do |config|
  config.before(:suite) do
    DatabaseCleaner.strategy = :truncation
    DatabaseCleaner.clean_with(:truncation)
  end
end

规格/制造者/ client_fabricators.rb

Fabricator(:client) do
  auth_id { (SecureRandom.hex)[0..3] }
  base_url { Faker::Internet.url }
end

最后, spec / requests / clients_spec.rb

before(:all) do
  DatabaseCleaner.start
  @clients = Fabricate.times(2, :client)
end

after(:all) do # Use after :all so data stays around until the end of the block
  DatabaseCleaner.clean
end

it {...}
it {...}
...

不幸的是,我收到的错误与it {...}context块一样多,所有错误都来自Mongoid:

Failure/Error: @clients = Fabricate.times(2, :client)
Mongoid::Errors::DocumentNotFound:

  Problem:
    Document not found for class Client with attributes {:auth_id=>"7123"}.

请注意,如果我使用@clients = Fabricate.times(1, :client)(这意味着只制作一个客户端),它就能完美运行。所以我认为问题出现在DatabaseCleaner中(我尝试了很多配置,但都没有成功)。

我使用Ruby 2.2.0,Rails 4.2.0(确切地说是rails-api),DatabaseCleaner 1.4.1,Mongoid 4.0.2和Fabrication 2.13.1

你对如何解决这个问题有任何想法吗?感谢。

1 个答案:

答案 0 :(得分:0)

这看起来可能是您的测试设置以及正在执行database_cleaner时的问题。通常会将其设置为单独封装每个示例运行,而不是之前和之后:all。

但是,如果你只是用它来清理你的mongoid文件,我想你可以完全抛弃它。 Fabrication在每个示例之前在其自己的测试套件中运行此操作。你可能想尝试一下。

Mongoid::Config.purge!

https://github.com/paulelliott/fabrication/blob/master/spec/support/mongoid.rb#L5