我花了几个小时来查找有关如何使用新MiniTest测试rails 4 app的信息,似乎每个人都使用rspec。我正在尝试测试所有级别的应用程序,目前仍然坚持如何测试持久化数据,例如我User
模型属于Account
,我想测试注册和身份验证,所有后验证的东西。目前我的所有测试都不是持久性的,模型级测试会在每次测试运行时创建用户。
但是我希望一些数据是持久的,例如少数用户帐户或带帐户的链接项目。我不希望每次运行都重新创建它们。但我无法找到有关rails 4和MiniTest的任何信息。
那么我应该用什么来保存数据呢? fixtures还是seed.rb?如何在控制器\集成测试期间重置数据?
答案 0 :(得分:3)
您应该使用fixtures为测试提供一组默认数据。 ActiveSupport :: TestCase将在DB事务中包装每个测试,回滚测试之间的所有更改。这意味着您无需在控制器或集成测试中重置数据库,它会自动为您完成。
答案 1 :(得分:1)
每次测试运行后都会清除测试数据库,以确保您有一个干净的平板。通常,您应该测试逻辑。测试数据是否持久化确实是Rails的工作,而且已经有自己的测试套件。
如果你真的想检查持久性,你可以这样:
lambda { user.save }.must_change "User.count", +1
但实际上,您应该测试的是自己的逻辑,而不是数据库的工作原理。
答案 2 :(得分: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类创建工厂并将关联(User)添加到工厂:
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。配置简单,有效!
希望有所帮助!
答案 3 :(得分:0)
如果我理解正确(并且我不完全确定我这样做),您可能会发现factory_girl在提供可用于测试的“持久数据”方面做了您想做的事。