18

与此处描述的问题类似: http ://rpheath.com/posts/411-how-to-use-factory-girl-with-rspec

简而言之(缩短的代码):

规范助手:

config.use_transactional_fixtures = true
config.use_instantiated_fixtures  = false

工厂.rb:

Factory.define :state do
  f.name "NY"
end

在我的规范中

before(:each) do 
  @static_model = Factory(:state) # with validate uniqueness of state name
end

错误:

重复的条目名称“NY”等


问题: rspec 不应该在每个规范示例之前清除数据库,从而不会引发重复输入错误吗?

4

7 回答 7

41

我认为的事情:

  • 您是否使用rake spec过运行您的测试套件:从头开始构建数据库(以确保没有任何问题)
  • 你在任何地方使用 abefore (:all)吗?因为您在 a 中创建的任何内容都before :all应该在 a 中再次删除,after :all否则它会继续存在。
于 2010-07-26T14:38:45.727 回答
3

问题: rspec 不应该在每个规范示例之前清除数据库,从而不会引发重复输入错误吗?

只要您在示例本身中创建了数据,带有 DatabaseCleaner 的 RSpec 或带有 use_transactional_fixtures 的 RSpec Rails就会清除数据库。before :all do ... end被认为在示例之外,因为数据在多个示例中保持不变。无论您在其中创建什么,before :all都必须在after :all.

为了删除您自动创建的任何内容,请使用before :each do ... end. 请注意,如果您有 10 个示例,则将创建和删除 10 次相同的数据。before :all和之间的区别在before :each这里得到更好的解释:rails rspec before all vs before each

于 2014-06-23T18:22:54.527 回答
2

还有一些可能的原因:

  • 还有一个 states.yml 固定装置
  • 有人在脚本/控制台测试中玩耍,之后忘记清理。
于 2010-08-01T15:19:10.733 回答
2

您可能还会发现这是因为您没有将语句包装在:

describe "what it should do" do
  @static_model = Factory(:state) # with validate uniqueness of state name
end

我发现这是解决此问题的更改: 为什么 factory_girl 不为我进行事务操作?- 测试后行保留在数据库中

于 2010-08-17T03:57:38.110 回答
1

关于使用 FG 和 RSpec 时可以期待什么样的起始状态,我也有类似的问题。

虽然我也在等待清晰,但数据库清洁器可能是一个很好的修复:http: //rubydoc.info/gems/database_cleaner/0.6.7/frames hth - Perry

于 2011-04-29T17:06:08.730 回答
0

当您使用 Factory(:state) 时,它是 Factory.create(:state) 的快捷方式,factory_girl 会返回一个已保存的对象。

请改用 Factory.build(:state)。

于 2011-10-03T02:05:32.870 回答
0

伙计,您的常规单元测试中的 yaml 固定装置可能会混入您的 rspec 吗?

于 2011-10-27T01:50:34.477 回答