4

我想使用 FactoryGirl 来构建模型的内存存根,然后让所有 ActiveRecord 查询仅针对这些查询运行。例如:

# Assume we start with an empty database, a Foo model, 
# and a Foo factory definition.

#foo_spec.rb
stubbed_foo = FactoryGirl.build_stubbed(:foo)

# Elsewhere, deep in the guts of application
Foo.first() # Ideally would return the stubbed_foo we created
            # in the test. Currently this returns nil.

解决方案可能是使用内存数据库。但上述情况可能吗?

4

1 回答 1

1

如果您避免使用数据库的原因是为了加快测试速度,那么还有更好的方法。

FactoryGirl.build尽可能使用而不是create. 只要您的代码不会从数据库中获取记录,这就会起作用。这适用于结构良好的代码的单元测试。(例如,它有助于使用服务对象并独立地对它们进行单元测试。

对于实际需要从数据库读取的测试(如在您的Foo.first示例调用中),您可以使用FactoryGirl.create和使用事务夹具。这会在每个测试示例的开头创建一个数据库事务,然后在示例结束时回滚该事务。当您在 ActiveRecord 模型中使用回调时,这可能会导致问题,例如after_commit.

如果您after_commit在模型中使用或其他需要关闭数据库事务的回调(或者您在代码中使用显式事务),我建议设置DatabaseCleaner。这是配置和使用它的示例:https ://gist.github.com/RobinDaugherty/9f4e5f782d9fdbe191a23de30ad8b539

于 2017-02-04T18:52:21.213 回答