gpt4 book ai didi

ruby - 如何通过 Rspec 测试 Proc 的分配?

转载 作者:太空宇宙 更新时间:2023-11-03 16:14:41 24 4
gpt4 key购买 nike

我正在使用 DataMapper gem。

我有一些代码可以根据特定规则动态创建表格。所以我有这样一行代码:

def set_table_name(table_name:)
adapter = DataMapper.repository(:default).adapter
adapter.resource_naming_convention = lambda { |_| table_name }
end

这直接来自他们的文档:http://www.rubydoc.info/github/datamapper/dm-core/DataMapper/NamingConventions

这工作得很好,但我想写一个规范来知道它正确地设置了命名约定。如果它不是 lambda 而只是设置值,那么我可能会这样做:

# assume 'adapter' is already set in the test, either as a mock or whatever
expect(adapter).to receive(:resource_naming_convention=).with("some_value")
something.set_table_name(table_name: "some_value")

由于 DataMapper 是一个外部依赖项,我不知道 setter 有什么副作用或要求,所以我只想验证它是否被正确调用。

但是,因为它是用 lambda 调用的,所以我不确定该怎么做。我可以这样做:

# assume 'adapter' is already set in the test, either as a mock or whatever
expect(adapter).to receive(:resource_naming_convention=).with(kind_of(Proc))
something.set_table_name(table_name: "some_value")

但我真的很想验证“some_value”是 Proc 的执行值。

我该怎么做?

最佳答案

一种方法是将 lamda 提取到一个函数中并将其 stub :

def set_table_name(table_name:)
adapter = DataMapper.repository(:default).adapter
adapter.resource_naming_convention = naming_convention_lambda
end

def naming_convention_lambda
lambda { |_| table_name }
end

# in tests ...

fn = lambda { |_| table_name }
expect(something).to(
receive(:naming_convention_lambda).and_return(fn)
)
expect(adapter).to(
receive(:resource_naming_convention=).with(fn)
)

如果需要,您可以单独测试 lambda。

此外,您可以将 lambda 更改为 proc 并删除 |_| 位,因为它不需要正确的参数长度。

关于ruby - 如何通过 Rspec 测试 Proc 的分配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48847713/

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