我是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)。
我现在有两个问题:
created_at
值会产生明显的副作用,即将url
属性的值更改为MyString
?是否更改created_at
日期是不允许的?created_at
日期需要具有特定值的逻辑中,在测试中安排数据的正确方法是什么?答案 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