【问题标题】:how to test rails 4 with persisted data?如何使用持久数据测试rails 4?
【发布时间】:2013-08-28 23:51:43
【问题描述】:

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

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

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

【问题讨论】:

  • 嘿,它不是很清楚吗?...我没明白
  • 你能提供一些你想测试的示例代码吗?

标签: ruby-on-rails minitest


【解决方案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 here

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

希望有帮助!

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        每次测试运行后都会清除测试数据库,以确保您有一张白纸。通常,您应该测试逻辑。测试数据是否持久化确实是 Rails 的工作,并且它已经包含在它自己的测试套件中。

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

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-11-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多