gpt4 book ai didi

ruby - RSpec -- 测试是否使用之前定义的 block 调用 block

转载 作者:行者123 更新时间:2023-11-28 20:45:22 30 4
gpt4 key购买 nike

recently asked如何在 RSpec 中测试是否调用了一个 block ,并且该问题的答案似乎在一个简单的案例中有效。问题是当 block 的初始化更复杂时。然后它在 before 中完成并被上下文中的许多不同测试重用,其中包括测试 block 是否被评估的测试。看例子:

context "the node definition using block of code" do
before do
@n=node do
# this block should be called
end
# some more complex setup concerning @n
end

it "should call the block" do
# how to test it?
end

# here a bunch of other tests using @n

end

在这种情况下,具有改变局部变量值的副作用的解决方案不起作用。从 block 中引发异常是没有用的,因为必须正确评估整个语句才能被其他测试使用。

显然,我可以单独进行测试,但它似乎很糟糕,因为我必须复制粘贴初始化部分,而且被称为 block 的测试本质上属于这个上下文。

在这种情况下如何测试 block 是否被评估?


下面@zetetic 提出的问题的解释。

上下文是我正在实现一种 DSL,节点 由它们的参数和代码块定义(可以在节点范围内定义其他内容)。由于节点 block 定义的内容可能非常通用,至少在第一次尝试时,我只需要确保对 block 进行评估,并考虑用户提供的内容。现在不管它是什么。

也许我现在应该重构我的测试并使用模拟让它们测试行为而不是实现。然而,为了一些混合和动态处理发送到对象的消息,它会有点棘手。目前,此类测试的概念在我脑海中有点模糊;-)

无论如何,您的回答和评论帮助我更好地理解了 RSpec 的工作原理,并解释了为什么我正在尝试做的事情看起来不符合 RSpec。

最佳答案

尝试这样的事情(未经我测试):

context "the node definition using block of code" do
let(:node){
node = Node.new "arg1", "arg2", node_block
# more complex stuff here
node
}
context "checking the block is called" do
let(:node_block) {
double = double("node_block")
double.should_receive("some kind of arg").and_return("something")
# this will now cause a fail if it isn't called
double
}
it "should call the block" do
node.blah()
end
end

let(:node_block) {
# some real code
}

subject { node.blah() }
it { should == 2 }
# ...
end

所以这是一段非常不稳定的代码(你必须填补空白,因为你没有付出太多继续,而且 let 显然也是一个 lambda,它可以意味着你必须尝试一下)它使用 let 和一个 double 来检查它是否被调用,并且避免使用 before,这实际上是针对副作用而不是设置变量以供在规范中使用。

@zetetic 发表了一个非常有见地的评论,您不是在这里测试行为。我不反对使用 rspec 来做更多的单元测试风格的东西(指南是用来打破的),但是你可能会问,如果没有调用那个 block ,那么当使用一个真正的代码块时,以后的测试将如何通过?在某种程度上,我什至不确定您是否需要检查 block 是否被调用,但只有您自己知道。

关于ruby - RSpec -- 测试是否使用之前定义的 block 调用 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13279966/

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