2013-08-26 13 views
0

我花了几个小时查找有关如何测试与新的MiniTest的轨道4应用程序的信息,似乎每个人都使用rspec。我试图测试所有级别的应用程序,目前停留在如何测试持久数据上,例如我的User模型属于Account,我想测试注册和身份验证以及所有post-auth事情。目前我所有的测试都不是持续性的,模型级测试会在每次测试中创建用户。如何用持久数据测试rails 4?

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

那我应该用什么来保存数据呢?夹具或seed.rb?如何在控制器\集成测试期间重置数据?

+0

嘿它是不是很清楚?...我没有得到它 –

+0

你能提供一些你想测试的代码示例吗? – MarkoHiel

回答

1

测试数据库在每次测试运行后都会被清除,以确保您拥有干净的板岩。一般来说,你应该测试逻辑。测试数据是否持久是Rails的工作,并且已经由自己的测试套件覆盖。

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

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

不过说真的,你应该测试是你自己逻辑,而不是数据库是否工作或没有。

0

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

3

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

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类和广告创建一个工厂d协会(用户)工厂:

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。这很容易配置,它的工作原理!

希望有帮助!

相关问题