- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在测试 Rails Controller 时,我有点困惑,是单独测试它们(模拟,更少的 DB 命中:更快),还是以集成方式(没有模拟,大量的 DB 命中:更慢)。
假设我们有这个例子:
class ProductsController
def create
product = Product.new(product_params)
if product.save
redirect_to root_path
else
render :new
end
end
private
def product_params
require(:product).permit(:name, :price)
end
end
RSpec.describe ProductsController do
describe '#create in isolation' do
it "pass" do
params = { name: "name", price: 100}
mocked_product = double(save: true)
expect(Product).to receive(:new).with(params).and_return(mocked_product)
post :create, params: { product: params }
expect(response).to be_redirect
end
end
describe '#create in integration' do
it "pass" do
params = { name: "name", price: 100}
post :create, params: { product: params }
expect(response).to be_redirect
end
end
end
单独测试不会影响数据库,这使得它更快,但是如果在产品模型中怎么办我们添加了一个必需的描述字段,我们忘记将其添加到 product_params 方法中,这将导致Product记录没有收到description,保存时无效。
然后第一个测试将毫无问题地通过,误报我们的 Controller 代码没问题,实际上这不是因为我们必须更改 product_params 方法才能正常工作
第二个测试将失败,因为我们没有模拟创建产品。
我认为无论如何这是一个悬而未决的问题/话题,所以我想知道在进行 Controller 测试时是否有最佳实践。
编辑(概括这个想法)
我认为这可以推广,因为它不仅限于 Controller ,而是隔离测试的概念,基本思想如下:
假设我们有一个函数 func(x,y),这个函数有它自己的单元测试。然后当我们有另一个 servive(S) 调用 func 时,我们将在其他地方测试 func 调用时 stub ,以节省执行 func 的时间(尤其是当它消耗时间时,如 DB 命中!)
期望(func).接收(some_x, some_y).and_return(some_value)
这是隔离测试的基本思想。
问题是,如果 func 的方法签名没有改变,但是现在从 S 传递给 func 的参数将使 func 抛出一些异常,因为 func 本身的一些实现发生了变化,S 仍在调用func 使用旧的参数值,现在将导致异常。由于我们模拟了对 func 的调用,S 测试不会捕获此错误并且代码将成功部署。
我相信这是一般模式
最佳答案
这实际上取决于您的优先级,以及您愿意为快速测试做出的牺牲。
当您删除数据库层时,模拟数据肯定意味着更快的测试。这样做的代价是,如果存在一个仅在您的 Controller 与数据持久层交互时才会出现的错误,您将不会发现该错误。快速单元测试与慢速全栈多件同时工作测试。
对此意见不一。 rails 测试的总体趋势似乎正在转向集成/功能/系统测试并放弃大多数 Controller 测试。这是因为随着高级 CSS 样式和 Javascript 的出现,现在有更多的东西在发挥作用。没有正确的答案。
关于ruby-on-rails - Rails Controller 测试 : Testing in isolation or integration?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47295753/
来自文档: Isolation.DEFAULT Use the default isolation level of the underlying datastore. 对于其他隔离级别,我们可以在
@Transactional(isolation = Isolation.SERIALIZABLE) 我在我的 spring 项目中的几个方法上有这个注释。如果由于“序列化访问问题”而出现异常,如果我
到目前为止我发现的“隔离”的解释。 实验#1:http://izs.me/v8-docs/classv8_1_1Isolate.html “Isolate 表示 V8 引擎的一个孤立实例。V8 分离株
我是单元测试和 Typemock 的新手。我想选择 typemock,因为我有很多遗留代码和很多依赖项。我知道 Isolator Basic 是免费版本,但他们也提供了 Isolator Comple
定义指令时,通常为它们提供一个独立的作用域,并且原型(prototype)上不会从任何父作用域继承。我一直很困惑这个术语应该是“隔离范围”还是“隔离范围”。 似乎大多数 AngularJS 官方文档都
$ pip install --no-build-isolation --editable . Usage: pip install [options] [package-index-opt
我有一个使用 mssql 的航类预订程序 ,对于预订航类,我想确定我应该使用隔离级别还是锁? (这是一个示例代码,我的问题是这种情况的隔离级别不做保留) 我的数据库有一个库存表,如: Inventor
我一直在玩 Dart Isolates并且在使用 isolate.pause(); 时遇到了问题功能。 import 'dart:io'; import 'dart:isolate'; main(){
隔离示例 flutter !不起作用。新的隔离不会运行。但是如果我删除入口点函数的 async。它工作正常。那么,如何在 flutter 中的新隔离中进行等待操作。 最佳答案 可能存在 Dart 2
当应用程序被杀死时,使用 flutter isolate 包的 Flutter isolates 不会显示通知。 尝试将 isolate 包与 dart:isolate 一起使用,但不起作用。 imp
据我了解,Dart 隔离就像 Akka Actor 。 然而,我想不通的是,如果 dart:isolate用途与 Akka 类似做。两者之间有根本区别吗? 是 dart:isolate一个 Actor
正如你们中的一些人所知道的,在 .net 中模拟静态方法通常是不可能的。 通过模拟,我的意思是用另一个具有相同签名的方法替换类中的方法,通常用于测试目的。 用于模拟方法的两种主要方法是将其声明为虚拟方
我有一个生成散列密码的应用程序,生成它需要时间。我认为为了提高性能,我会让散列密码生成器在一个单独的核心中工作。我的计算机支持 3 个核心处理器,我认为使用 dart:isolate 来计算其他处理器
我正在尝试在Dart Web应用程序中使用隔离,但是我似乎无法使错误回调参数起作用。 我有一个非常基本的代码正在Dartium中运行。 import "dart:isolate"; void main
我正在试验 Dart 并使用新的 streamSpawnFunction 创建一个新的隔离。 我在 Dartium 中运行我的代码,但我注意到如果在隔离中发生某种不可恢复的错误,我不会在控制台上收到任
我的问题的背景:我正在开发一个 Flutter 应用程序,它每隔几个小时执行一次重复的后台事件,并在有任何更新时通知用户。 目前,我已经创建了一个能够执行后台事件的隔离功能(但目前尚未安排),并且我正
我需要在 V8 中有数千个隔离物。但是当我有一些空闲 RAM 时,我遇到了奇怪的内存问题,但是 v8 抛出了 OOM 错误消息。 例如, 在这种特殊情况下,您可以看到当 V8 抛出此错误时我们仍然有一
我有大约 10k 个长时间运行的任务需要按顺序计算。为此,我决定使用 Isolates。问题是我应该每次都为每个单独的任务创建 spawn Isolate 还是应该为所有任务的执行只创建一个 Isol
Moles是微软创建的隔离框架。 Moles 的一个很酷的特性是它可以“模拟”静态/非虚拟方法和密封类(这对于像 Moq 这样的框架是不可能的)。下面是 Moles 可以做什么的快速演示: Asser
谁能解释一下垃圾收集的孤立岛的概念吗? 最佳答案 对象 A 引用对象 B。对象 B 引用对象 A。对象 A 和对象 B 都没有被任何其他对象引用。那是一座孤岛。 基本上,隔离岛是一组相互引用但不被应用
我是一名优秀的程序员,十分优秀!