如何测试依赖于created_at属性的视图和控制器逻辑?

时间:2017-09-25 15:22:32

标签: ruby-on-rails unit-testing

我是Ruby on Rails的新手。

我有一个带有简单控制器和视图的应用程序,它使用我最近创建的(最早的第一个)订单中的数据库中的Active Record对象列表呈现HTML页面。

我尝试编写一个测试,通过创建具有不同created_at值的两个对象来验证此排序行为,然后验证生成的HTML是否具有最早的项目(使用assert_select)。 / p>

但是,当我尝试手动更改其中一个对象的created_at值(以确保我的对象没有相同的created_at值)时,对象的其他属性会出现设置为默认值。例如,我的测试中的此代码会生成一个Image对象,其url属性值为http://www.example.com/image1.png,符合预期:

@image1 = Image.create!(url: 'http://www.example.com/image1.png')

但是,此代码会导致数据库中的url属性值意外更改为MyString

@image1 = Image.create!(url: 'http://www.example.com/image1.png')
@image1.created_at = '2017-09-25'
@image1.save

我正在使用ruby 2.3.3和rails 5.1.1.1(根据我的Gemfile)。

我现在有两个问题:

  1. 为什么在我的对象上设置created_at值会产生明显的副作用,即将url属性的值更改为MyString?是否更改created_at日期是不允许的?
  2. 在对象的created_at日期需要具有特定值的逻辑中,在测试中安排数据的正确方法是什么?

2 个答案:

答案 0 :(得分:0)

1)您使用的是FactoryGirl吗?

2)上传者类是否附加到Image模型?

3)您可以修改测试控制台内的Image对象吗?

 $ RAILS_ENV=test bin/bundle exec bin/rails c     

答案 1 :(得分:0)

created_at属性的类型应为DateTime,而不是String。尝试将字符串分配给created_at属性时,会弄乱测试对象。请尝试以下

@image1.created_at = 2.days.from_now

@image1.created_at = 2.days.ago