UnitRecord技术文档
1. 安装指南
首先,确保您的环境中已经安装了Ruby和Rails。接下来,通过以下命令安装UnitRecord:
gem install unit_record
2. 项目的使用说明
UnitRecord旨在帮助开发者对ActiveRecord类进行单元测试,而不需要连接到数据库。这样做的主要好处是可以加快测试套件的运行速度。
重构Rails测试目录
Rails的测试目录通常将模型测试放在test/unit
,控制器测试放在test/functional
。但我们需要重新定义单元和功能测试。控制器可以进行单元测试(模拟模型并渲染视图),而模型可以进行功能测试(实际访问数据库)。每种测试类型都需要自己的测试辅助文件。建议您的测试目录结构如下:
test
test_helper.rb
unit
unit_test_helper.rb
controllers
models
functional
functional_test_helper.rb
controllers
models
将现有的功能测试移动到functional/controllers
,并修改测试文件顶部的require
行,以引入functional_test_helper.rb
而不是test_helper.rb
。
functional_test_helper.rb
文件只需要引入test_helper.rb
:
require File.dirname(__FILE__) + "/../test_helper"
对于单元测试的移动,建议将其移至unit/models
,并断开单元测试与数据库的连接。任何失败的测试都应该修改为不访问数据库或移动到functional/models
。
使用方法
在重构测试目录时创建的test/unit/unit_test_helper.rb
文件中,添加以下代码:
require File.dirname(__FILE__) + "/../test_helper"
require "unit_record"
ActiveRecord::Base.disconnect!
disconnect!
方法将执行所有必要操作,以在不连接数据库的情况下运行您的单元测试。
策略
如果您的代码尝试访问数据库,UnitRecord提供了两种策略:抛出异常或不执行任何操作(no-op)。抛出异常可以帮助您确定测试失败的原因,但可能不方便处理。
如果您希望抛出异常:
ActiveRecord::Base.disconnect! :strategy => :raise
如果您希望不执行任何操作:
ActiveRecord::Base.disconnect! :strategy => :noop
您还可以在块内更改策略:
ActiveRecord::Base.connection.change_strategy(:raise) do
Person.find(:all)
end
ActiveRecord::Base.connection.change_strategy(:noop) do
Person.find(:all)
end
关联存根
单元测试ActiveRecord类的一个痛点是设置关联。由于Rails在设置关联时进行类型检查,如果您尝试使用存根替换预期类,将会收到异常。
Pet.new :owner => stub("person")
如果使用mocha,可以启用UnitRecord进行关联存根。要启用关联存根功能:
ActiveRecord::Base.disconnect! :stub_associations => true
3. 项目API使用文档
UnitRecord主要提供了disconnect!
方法,用于断开ActiveRecord与数据库的连接。该方法接受一个策略参数,用于定义当尝试访问数据库时应该采取的行为。
:raise
:抛出异常:noop
:不执行任何操作
此外,您可以使用change_strategy
方法在块内临时更改策略。
4. 项目安装方式
如前所述,您可以通过Ruby的gem包管理器安装UnitRecord:
gem install unit_record
确保在您的Rails项目中包含UnitRecord,并在测试辅助文件中正确配置。
鸿蒙开发工具大赶集
本仓将收集和展示鸿蒙开发工具,欢迎大家踊跃投稿。通过pr附上您的工具介绍和使用指南,并加上工具对应的链接,通过的工具将会成功上架到我们社区。017inference
通过更改一行代码,您可以在应用程序中用另一个大型语言模型(LLM)替换OpenAI GPT。Xinference赋予您使用任何所需LLM的自由。借助Xinference,您能够在云端、本地、甚至笔记本电脑上运行任何开源语言模型、语音识别模型和多模态模型的推理。Python00每日精选项目
🔥🔥 每日精选已经升级为:【行业动态】,快去首页看看吧,后续都在【首页 - 行业动态】内更新,多条更新哦~🔥🔥 每日推荐行业内最新、增长最快的项目,快速了解行业最新热门项目动态~~033BootstrapAdmin
基于 RBAC 的 Net8 后台管理框架,权限管理,前后台分离,支持多站点单点登录,兼容所有主流浏览器,内置微信、支付宝、QQ等多种登录方式,内置多种样式,可切换至 Blazor 多 Tabs 模式,权限控制细化到网页内任意元素(按钮、表格、文本框等等)C#00phalapi
PhalApi开源接口框架,简称π框架,一个轻量级PHP开源接口框架,专注于接口服务开发。接口,从简单开始!Objective-C00Cangjie-Examples
本仓将收集和展示高质量的仓颉示例代码,欢迎大家投稿,让全世界看到您的妙趣设计,也让更多人通过您的编码理解和喜爱仓颉语言。Cangjie062毕方Talon工具
本工具是一个端到端的工具,用于项目的生成IR并自动进行缺陷检测。Python040PDFMathTranslate
PDF scientific paper translation with preserved formats - 基于 AI 完整保留排版的 PDF 文档全文双语翻译,支持 Google/DeepL/Ollama/OpenAI 等服务,提供 CLI/GUI/DockerPython06mybatis-plus
mybatis 增强工具包,简化 CRUD 操作。 文档 http://baomidou.com 低代码组件库 http://aizuda.comJava03国产编程语言蓝皮书
《国产编程语言蓝皮书》-编委会工作区018
热门内容推荐
最新内容推荐
项目优选









