- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我有一个简单的 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
已弃用,不建议在您的测试中使用。
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/
假设我们有以下代码: class A def create_server options = { name: NameBuilder.new.build_name }
我的 mock 只有在如下所示的 before block 中时才有效。这只是我对我的问题的快速而肮脏的表述。从字面上看,当我将行从 before block 移动到 does not quack 断
由于 rubocop 错误,我想避免在我的规范中使用 allow_any_instance_of。 我正在尝试改变这个: before do allow_any_instance_of(A
在 the documentation Rspec Mocks 维护者 ... discourage its use for a number of reasons... 列出的原因似乎与 expec
我是 RSpec 的新手,正在测试一些带有请求类型的 webhook 测试。但即使我在这里使用 allow_any_instance_of,它也会出错 got 500 instead of 200。我
我在学习 rspec stub 的工作原理时遇到了一些麻烦。 我必须测试以下辅助方法,我希望将输出字符串测试为 html: def build_links(resource) YAML.load_
有没有可能做这样的事情??? allow_any_instance_of(Object).to receive(:foo).and_return("hello #{instance.id}") 我可以
我有一个简单的 MySQL 包装类,它将运行查询并返回结果。 class Rsql def initialize(db) @client = Mysql2::Client @db
我有下一个问题。当我尝试使用 stub ActiveRecord 模型的实例方法时allow_any_instance_of 我收到错误消息“模型未实现#method”,但是如果我在此 stub 之前
我是一名优秀的程序员,十分优秀!