gpt4 book ai didi

ruby - 需要和不需要 ActiveSupport 的单元测试

转载 作者:数据小太阳 更新时间:2023-10-29 08:04:44 28 4
gpt4 key购买 nike

我已经从 Rails 应用程序中提取了一个类到 a gem 中.它非常非常简单,但我当然想对其进行全面测试(我使用的是 rspec)。

该类进行一些简单的日期计算。它不依赖于 Rails,但由于它是在 Rails 应用程序中开始的,并且仍然在那里使用,所以它尽可能使用 ActiveSupport 的时区感知方法。但是,如果 ActiveSupport 不可用,它应该使用 std-lib Date 方法。

具体来说,它只在一个地方执行此操作:将可选参数默认为“今天的日期”:

arg ||= if Date.respond_to?(:current)
Date.current # use ActiveSupport's time zone-aware mixin if possible
else
Date.today # stdlib fallback
end

问题是:我该如何正确测试它?如果我在我的 spec_helper.rb 中需要 ActiveSupport,它显然总是使用它。如果我在任何地方都不需要它,它永远不会使用它。如果我需要它用于单个示例组,rspec 的随机执行顺序会使测试变得不可预测,因为我不知道何时需要 AS。

我可以在嵌套组的 before(:all) 中要求它,因为嵌套组(我相信)是从最高层到最深层处理的。但这似乎非常不优雅。

我也可以将规范拆分为两个文件,然后分别运行它们,但同样,这似乎没有必要。

我也可以禁用 rspec 的随机排序,但这有点违背常理。我宁愿让它尽可能随机。

有什么想法吗?

最佳答案

另一种解决方案是模拟 currenttoday 方法,并将它们用于测试。例如:

# you won't need these two lines, just there to make script work standalone
require 'rspec'
require 'rspec/mocks/standalone'

def test_method(arg = nil)
arg ||= if Date.respond_to?(:current)
Date.current # use ActiveSupport's time zone-aware mixin if possible
else
Date.today # stdlib fallback
end
arg
end

describe "test_method" do
let(:test_date) { Date.new(2001, 2, 3) }
it "returns arg unchanged if not nil" do
test_method(34).should == 34
end

context "without Date.current available" do
before(:all) do
Date.stub(:today) { test_date }
end
it "returns Date.today when arg isn't present" do
test_method.should == test_date
end
end

context "with Date.current available" do
before(:all) do
Date.stub(:current) { test_date }
end
it "returns Date.current when arg isn't present" do
test_method.should == test_date
end
end
end

运行 rspec test.rb 会导致测试通过。

此外, stub 仅存在于每个上下文中,因此运行规范的顺序无关紧要。

关于ruby - 需要和不需要 ActiveSupport 的单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16985399/

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