0

我花了几个小时寻找有关如何使用新的 MiniTest 测试 rails 4 应用程序的信息,似乎每个人都使用 rspec。我正在尝试测试所有级别的应用程序,并且目前坚持如何测试持久数据,例如我有User属于的模型,Account我想测试注册和身份验证以及所有后身份验证的事情。目前我所有的测试都不是持久的,模型级别的测试会在每次测试运行时创建用户。

但是我希望一些数据是持久的,例如几个用户帐户,或者与帐户相关联的项目。我不想在每次运行时重新创建它们。但我找不到任何关于 rails 4 和 MiniTest 的信息。

那么我应该用什么来持久化数据呢?固定装置或seed.rb?如何在控制器\集成测试期间重置数据?

4

4 回答 4

3

您应该使用固定装置为您的测试提供一组默认数据。ActiveSupport::TestCase 将每个测试包装在一个数据库事务中,回滚测试之间的所有更改。这意味着您无需在控制器或集成测试中重置数据库,它会自动为您完成。

于 2013-09-10T19:28:25.037 回答
1

每次运行测试时,它们都会在干净的数据库上运行。就像其他人说的,你应该测试你的应用程序的逻辑!您可以使用FactoryGirl为您的测试添加持久性。您可以定义自己的工厂并在测试中使用它们创建对象。

例如,定义工厂很容易:

FactoryGirl.define do
  factory :user do
    first_name "John"
    last_name  "Doe"
    admin false
  end
end

之后,在你的测试中,你可以调用这个工厂:

# Returns a User instance that's not saved in database
user = FactoryGirl.build(:user)

# Returns a saved (in database) User instance
user = FactoryGirl.create(:user)

此外,您可以为用户的属性提供自己的值:

jane_doe = FactoryGirl.create(:user, first_name: "Jane", last_name: "Doe")

在您的情况下,如果您想为 Account 类创建一个工厂并将关联(用户)添加到工厂:

FactoryGirl.define do
  factory :user do
    first_name "John"
    last_name  "Doe"
    admin false
  end
  factory :account do
    acc_number 123456789
    full_name "John Doe"
    association :user, factory: :user 
  end
end

您可以在此处阅读有关 FactoryGirl的更多信息

此外,关于清理数据库,您可以查看Database Cleaner gem。它易于配置并且有效!

希望有帮助!

于 2013-09-10T19:56:04.183 回答
1

每次测试运行后都会清除测试数据库,以确保您有一个干净的状态。一般来说,您应该测试逻辑。测试数据是否被持久化确实是 Rails 的工作,它已经包含在它自己的测试套件中。

如果你真的想检查持久性,你可以这样:

  lambda { user.save }.must_change "User.count", +1

但实际上,你应该测试的是你自己的逻辑,而不是数据库是否工作。

于 2013-08-26T16:37:34.930 回答
0

如果我对您的理解正确(并且我不完全确定我是否这样做),您可能会发现factory_girl在提供可用于测试的“持久数据”方面做了您想要的。

于 2013-08-26T19:58:55.840 回答