Rails 测试用例:除了全局夹具之外,还有什么方法可以为特定测试用例创建夹具吗?

Rails Test Case: Rather than global fixtures is there any way to create fixtures for specific test case?

我正在使用 rails mintiest 框架来编写测试用例。我想测试 rails activerecord sql 查询。为了测试 activerecord 查询,我使用了 rails 为测试提供示例数据的装置。

最初,我的夹具文件中只有两条记录users.yml,如下所示:

user1:
  name: 'xxx'

user2:
 name: 'xyz'

现在有了以上数据,我编写了一个测试用例,计算数据库中的记录数等于 2,并且工作正常。但是当我在其他测试用例场景所需的 users.yml 文件中再添加一个用户时,问题就出现了,计数变为 3,测试用例失败。

我想知道,有什么方法可以为特定的测试用例创建夹具,让每个测试用例都有自己的夹具数据吗?

如果答案是肯定的,那么即使我在夹具文件中添加额外的用户记录,我计算数据库中记录数的测试用例也不会失败。

有几种方法可以解决这个问题 - 有些人可能会建议根本不使用固定装置,这可能值得在未来研究。然而,最直接的解决方案是:永远不要测试数据库的特定状态。如果您将测试设置为:

it 'should add one' do
  User.create(username: 'username')
  assert_equal 2, User.count
end

改为简单地计算用户数增加了一个:

it 'should add one' do
  count = User.count
  User.create(username: 'username')
  assert_equal count + 1, User.count
end

事实上,有一个专门针对这个用例的自定义断言:

http://apidock.com/rails/ActiveSupport/Testing/Assertions/assert_difference

it 'should add one' do
  assert_difference("User.count", 1) do
    User.create(username: 'username')
  end
end