首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何测试Rails迁移?

如何测试Rails迁移?
EN

Stack Overflow用户
提问于 2011-05-21 01:24:58
回答 8查看 13K关注 0票数 57

在运行我编写的迁移之后,我想测试某些条件是否成立。目前最好的方法是什么?

具体来说:我进行了一次迁移,向模型中添加了一列,并为其提供了默认值。但是我忘记了更新该模型的所有预先存在的实例,使其具有新列的默认值。我现有的测试都不能捕捉到这一点,因为它们都从一个新的数据库开始,并添加新的数据,这将是默认的。但如果我推动生产,我知道事情会崩溃,我希望我的测试能告诉我这一点。

我找到了http://spin.atomicobject.com/2007/02/27/migration-testing-in-rails/,但还没试过。它很古老了。这是最先进的吗?

EN

回答 8

Stack Overflow用户

发布于 2012-04-14 16:26:42

Peter Marklund在这里有一个测试迁移的示例要点:https://gist.github.com/700194 (在rspec中)。

注意,自从他的示例以来,迁移已经更改为使用实例方法而不是类方法。

以下是摘要:

  1. 像往常一样创建迁移
  2. 创建一个文件来放置您的迁移测试。建议:test/unit/import_legacy_devices_migration_test.rbspec/migrations/import_legacy_devices_migration_spec.rb注意:您可能需要显式加载迁移文件,因为rails可能不会为您加载它。应该是这样的:require File.join(Rails.root, 'db', 'migrate', '20101110154036_import_legacy_devices')
  3. Migrations (就像ruby中的所有东西一样),只是一个类。测试updown方法。如果您的逻辑很复杂,我建议将一些逻辑重构为更容易测试的较小方法。
  4. 在调用up之前,像迁移之前一样设置一些数据,并断言它的状态是您在迁移后所期望的。

我希望这能帮到你。

更新:自从发布了这篇文章后,我在我的博客上发布了一个example migration test

更新:这是一个测试迁移的想法,即使迁移已经在开发中运行。

编辑:我已经使用我的博客文章中的人为示例将我的概念验证更新为一个完整的规范文件。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# spec/migrations/add_email_at_utc_hour_to_users_spec.rb
require 'spec_helper'

migration_file_name = Dir[Rails.root.join('db/migrate/*_add_email_at_utc_hour_to_users.rb')].first
require migration_file_name


describe AddEmailAtUtcHourToUsers do

  # This is clearly not very safe or pretty code, and there may be a
  # rails api that handles this. I am just going for a proof of concept here.
  def migration_has_been_run?(version)
    table_name = ActiveRecord::Migrator.schema_migrations_table_name
    query = "SELECT version FROM %s WHERE version = '%s'" % [table_name, version]
    ActiveRecord::Base.connection.execute(query).any?
  end

  let(:migration) { AddEmailAtUtcHourToUsers.new }


  before do
    # You could hard-code the migration number, or find it from the filename...
    if migration_has_been_run?('20120425063641')
      # If this migration has already been in our current database, run down first
      migration.down
    end
  end


  describe '#up' do
    before { migration.up; User.reset_column_information }

    it 'adds the email_at_utc_hour column' do
      User.columns_hash.should have_key('email_at_utc_hour')
    end
  end
end
票数 20
EN

Stack Overflow用户

发布于 2017-05-16 21:09:54

我只需创建该类的一个实例,然后对其调用updown

例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
require Rails.root.join(
  'db',
  'migrate',
  '20170516191414_create_identities_ad_accounts_from_ad_account_identity'
)

describe CreateIdentitiesAdAccountsFromAdAccountIdentity do
  subject(:migration) { described_class.new }

  it 'properly creates identities_ad_accounts from ad account identities' do
    create_list :ad_account, 3, identity_id: create(:identity).id

    expect { suppress_output { migration.up } }
      .to change { IdentitiesAdAccount.count }.from(0).to(3)
  end
end
票数 8
EN

Stack Overflow用户

发布于 2011-05-23 16:27:31

我进行了一次迁移,向模型中添加了一列,并为其提供了默认值。但是我忘记了更新该模型的所有预先存在的实例,使其具有新列的默认值。

基于这句话,你只是想测试一个“旧的”模型,有缺省的,对吗?

从理论上讲,您正在测试rails是否正常工作。也就是说,“rails是否为新添加的列设置了默认值”

添加列和设置默认值将存在于数据库的“旧”记录中。

因此,您不需要更新其他记录来反映默认设置。理论上没有什么需要测试的,因为rails已经为您测试过了。最后,使用默认值的原因是,您不必更新以前的实例即可使用该默认值,对吧?

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6079016

复制
相关文章
Rails测试:Rspec
One: Case Study Debug sucks, and test rocks! If you use rails, then you should know how to use RSpec to test your rails app. I use a simple case to practice basic RSpec. If you want practice, go to check the saasbook/bdd-tdd-cycle practice at the end of th
用户2183996
2018/06/28
1.1K0
如何使用Passenger和Nginx部署Rails
如果您是Ruby on Rails开发人员,可能需要Web服务器来托管您的Web应用程序。本教程将向您展示如何使用Phusion Passenger。作为Rails的Web服务器,Passenger易于安装,配置和维护,可与Nginx或Apache一起使用。在本教程中,我们将在Ubuntu上安装带有Nginx的Passenger。
乌鸦
2018/08/06
5.1K0
如何使用Passenger和Nginx部署Rails
rails -help
rails new APP_PATH [选项] //APP_PATH项目名称
不知雨
2018/11/13
2.6K0
C - Rails
C - Rails C - Rails #include<cstdio> #include<stack> #include<cstring> using namespace std; int a[1010]; int main() { int n; while (~scanf("%d",&n) && n) { while (1) { stack<int> s; scanf("%d",&a[0]); if (!a[0]) { puts(""); brea
杨鹏伟
2020/09/11
6850
Rails资源
Rails Resources Here I list some rails resources I found very helpful. Quick Start Ruby on Rails Guides Rails Bridge Tutorials Point Book The Rails 4 Way, Best rails book. Ruby on Rails Tutorial API Ruby on Rails API Screencast Rails Casts, excellent rai
用户2183996
2018/06/28
8540
Ruby On Rails 4 hello world,Ruby On Rails上手
有机会再试一试Rails了,仅仅是原来接触的是2,如今已然变成了4,似乎如今的安装比原来会快些。。
全栈程序员站长
2022/07/12
2.5K0
Ruby On Rails 4 hello world,Ruby On Rails上手
数据迁移(2) - 如何快速迁移
在上一篇中我们介绍了数据迁移的套路,但是没有介绍具体的方案,这篇着重介绍下具体的数据迁移方案
方丈的寺院
2020/05/20
3.3K0
Rails路由
在创建资源路由时,会同时创建多个可以在控制器中使用的辅助方法,如上面的资源路由会创建以下方法:
用户1515472
2019/07/24
4.5K0
Rails 部署总结
学 Ruby 和 Rails 有一段时间了,后面准备也准备把站点换了。不过开始开发之前,我先把 Rails 部署的坑先踩了。之所以部署先行是因为之前 Django 部署把我坑惨了,导致之前写的 Django 代码还是 Github 静静地躺着。 忽悠妹子给我在腾讯云买了服务器后,马不停蹄的就开始了填坑之旅。这里我选择的系统是 Ubuntu 16.04 ,所以下面的命令以此为准。
BigNerdCoding
2018/03/20
7K4
Rails 部署总结
推荐三篇不错的文章:我们能从 Rails 框架学到的经验 & 在 Ruby on Rails 中进行单元测试
Ruby on Rails 好像一直处于争论的风口浪尖。大多数争论的核心是其所宣称的令人惊异的生产力。 跨越边界 的作者 Bruce Tate 已经开始理解 Rails 并不是一个更好的工具,而是一个不同类型的工具。本文研究了使 Rails 在某个领域如此高效率的折衷和设计决策。然后思索了应该在 Java™ 社区获得更多关注的受 Rails 启发的思想。
阿敏总司令
2019/02/28
1.2K0
[测试面试问题]服务端服务器进行迁移,需要如何回归测试?
在之前回顾2021,展望2022,今年要做一些分享,所以组建了三个新群,提了一些问题。让大家整理汇总,但是一直都是丢问题,但是没有整理,今天,抽空把之前的问题做些汇总。
雷子
2022/02/11
6910
<Sicily>1001. Rails
1001. Rails Time Limit: 1sec Memory Limit:32MB
梦飞
2022/06/23
5700
如何在Ubuntu 18.04上使用RVM安装Ruby on Rails
Ruby on Rails是一个流行的Web应用程序框架,旨在帮助您开发成功的项目,同时编写更少的代码。为了使Web开发变得有趣并且受到强大社区的支持,Ruby on Rails是一个可以免费使用的开源软件,并且欢迎各位用户提出建议以使其更好。
独钓寒江雪_Ly
2018/10/10
8.9K0
如何在Ubuntu 18.04上使用rbenv安装Ruby on Rails
Ruby on Rails是创建网站和Web应用程序的开发人员最受欢迎的应用程序堆栈之一。Ruby编程语言与Rails开发框架相结合,使应用程序开发变得简单。
司徒永哥
2018/10/10
6.4K0
如何使用RVM在FreeBSD 10.1上安装Ruby on Rails
Ruby on Rails,简称RoR,是一个用Ruby编写的非常流行的全栈Web应用程序开发框架。它允许您快速开发符合MVC(模型 - 视图 - 控制器)模式的Web应用程序。
一步
2018/10/10
4.6K0
Ruby on Rails 基础(6)
没有创建成功,但是反馈结果却是成功 (说明这是一批命令,最后一个反馈结果正常),并且生成一个文件目录
franket
2021/11/25
1.7K0
Ruby on Rails 基础(7)
Note: bundle install 过程中有一个警告,让我们不要使用 root,这样会让其它用户无法操作此应用,其实还有一定安全隐患,这里为图方便,只为了解功能就不去讲究这些了,生产环境下要非常注意 Don’t run Bundler as root. Bundler can ask for sudo if it is needed, and installing your bundle as root will break this application for all non-root user
franket
2021/11/25
1K0
Ruby on Rails 基础(9)
报错:There was an error while trying to load the gem 'uglifier'. (Bundler::GemRequireError)
franket
2021/11/25
9470
Rails里应用Markdown
Use Markdown and Pygments Markdown is pretty awesome for writing, you just type in some tag and your article is formated. You just need to concentrate on the content of your article without worrying about format. In your rails app, you can use easily do th
用户2183996
2018/06/28
7840
Ruby on Rails 基础(1)
这两条编码哲学可以算是历代猴子们的智慧结晶,核心目标只有一个,最大化的减少代码规模,明确核心逻辑,而这样的好处是多多的(编码效率高,Debug也快)
franket
2021/11/25
1.2K0

相似问题

Rails:测试迁移文件

10

Rails测试环境不迁移

20

单元测试:如何测试rails迁移是否被调用?

212

针对Rails测试环境运行迁移

12

无需迁移的Rails功能测试

23
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文