gpt4 book ai didi

ruby-on-rails - 是否对给定种类的任何实例有任何 RSpec 期望?

转载 作者:行者123 更新时间:2023-12-05 07:09:42 24 4
gpt4 key购买 nike

我需要用测试覆盖我的 Ruby on Rails 代码。我使用 RSpec 进行测试。

有什么方法可以根据它们的种类模拟调用实例吗? (种类?)。我想测试给定父类的 child 是否被调用。我期待类似 allow_any_kind_of 方法的东西,类似于 allow_any_instance_of。但是我找不到类似的东西。

这是我的代码示例。我有 Base 类和它的一些子类。在测试中,使用什么确切的 child 并不重要。

class Parent
def my_method; end
end
class ChildA < Parent; end
class ChildB < Parent; end

class App
def apply
[ChildA.new, ChildB.new].all? { |c| c.my_method }
end
end

我的 RSpec 测试。它失败了,因为 ChildA 或 ChildB 都不是 Parent 类的实例。我可以有多个 allow_any_instance_of 来覆盖所有 Parent 的 child ,但我想保持简单,因为在实际代码中会有更多的 child 。

context "#apply" do
before do
allow_any_instance_of(Parent).to receive(:my_method).and_return(true)
end

it "returns true" do
expect(subject.apply).to be_truthy
end
end

最佳答案

我认为没有直接的方法来设置任何子类实例的期望值。然而,将依赖项注入(inject)您的方法将使您更容易对其进行测试。

您可以用类似于以下的方式重写它:

class App
def initialize(params_hash)
@children = params_hash[:children] || [ChildA.new, ChildB.new]
end

def apply
children.all? { |c| c.my_method }
end

private

attr_reader :children
end

然后在你的测试中你可以做类似下面的事情:

describe "#apply" do
it "returns true" do
children = [instance_double('SubClassA', my_method: true)]
expect(children.first).to receive(:my_method)
app = App.new(children: children)
expect(app.apply).to be true
end
end

使用 expect_any_instance_of 可能是代码异味的迹象,每当我开始考虑使用它时,我都会停下来查看我的代码并验证我是否可以以更好的方式编写它,以便它易于测试,依赖注入(inject)使代码易于测试。

这里您要做的是 Hook apply 方法并验证它的作用,但我们的客户端代码在测试中无法检查其中发生的事情。所以我会注入(inject)我的依赖项,并在对我来说有效且合理的情况下对它们设定我的期望。

关于ruby-on-rails - 是否对给定种类的任何实例有任何 RSpec 期望?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61464230/

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