gpt4 book ai didi

ruby-on-rails - Rails Controller 测试 : Testing in isolation or integration?

转载 作者:行者123 更新时间:2023-11-28 20:50:56 26 4
gpt4 key购买 nike

在测试 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com