gpt4 book ai didi

ruby - Rspec:allow 和 allow_any_instance_of 之间的区别

转载 作者:数据小太阳 更新时间:2023-10-29 07:18:20 25 4
gpt4 key购买 nike

我有一个简单的 MySQL 包装类,它将运行查询并返回结果。

class Rsql
def initialize(db)
@client = Mysql2::Client
@db = db
end

def execute_query()
client = @client.new(@db)
client.query("select 1")
end

end

我想测试一些涉及查询结果的东西,但我不想实际连接到数据库来获取结果。我试过这个测试,但它不起作用:

RSpec.describe Rsql do

it "does it" do
mock_database = double
rsql = Rsql.new(mock_database)

mock_mysql_client = double
allow(mock_mysql_client).to receive(:query).and_return({"1" => 1})

allow_any_instance_of(Mysql2::Client).to receive(:new).and_return(mock_mysql_client)
expect(rsql.execute_query).to eq({"1" => 1})
end

end

allow_any_instance_of() 替换为 allow() 有效。我的印象是 allow_any_instance_of() 是某种全局的“假装这个类在整个程序中以这种方式表现”,而 allow() 是针对特定实例的一个类(class)。

有人可以向我解释这种行为吗?我是 Rspec 的新手,所以如果这个答案显而易见,我深表歉意。我尝试搜索答案,但找不到正确的搜索字符串来找到答案。也许我知道的不够多,不知道什么时候找到它。

最佳答案

从 RSpec 3.3 开始,any_instance 已弃用,不建议在您的测试中使用。

From the docs :

any_instance is the old way to stub or mock any instance of a class but carries the baggage of a global monkey patch on all classes. Note that we generally recommend against using this feature.

以后您应该只需要使用 allow(some_obj) 并且文档中有一些很好的示例(参见 here )。

如:

RSpec.describe "receive_messages" do
it "configures return values for the provided messages" do
dbl = double("Some Collaborator")
allow(dbl).to receive_messages(:foo => 2, :bar => 3)
expect(dbl.foo).to eq(2)
expect(dbl.bar).to eq(3)
end
end

编辑,如果你真的想使用any_instance,这样做:

(Mysql2::Client).allow_any_instance.to receive(:something)

Edit2,您的确切 stub 不起作用,因为您不是在 stub 实例,而是在对象初始化之前 stub 。在这种情况下,您可以执行 allow(Mysql2::Client).to receive(:new)

关于ruby - Rspec:allow 和 allow_any_instance_of 之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32877582/

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