gpt4 book ai didi

ruby-on-rails - RSpec 'change' : Braces or brackets?

转载 作者:数据小太阳 更新时间:2023-10-29 08:38:58 24 4
gpt4 key购买 nike

我正在关注 Michael Hartl 的 Rails 教程,其中有一个 RSpec 测试代码片段:

expect do
click_button 'Follow'
end.to change(user.followed_users, :count).by(1)`

根据RSpec documentation以及我是如何在 Codeschool 上学习的,这真的应该是:

expect do
click_button 'Follow'
end.to change {user.followed_users.count}.by(1)

显然它们都是有效的,但在 RSpec 文档中似乎没有关于执行更改匹配器的第一种方法的文档,我想知道它为什么/如何工作。

最佳答案

我在 Relish 文档中也找不到它,但 RSpec 毕竟是开源的,所以让我们深入研究。在 the current version of the change matcher 中:

module RSpec
module Matchers
module BuiltIn
class Change
def initialize(receiver=nil, message=nil, &block)
@message = message
@value_proc = block || lambda {receiver.__send__(message)}
@expected_after = @expected_before = @minimum = @maximum = @expected_delta = nil
@eval_before = @eval_after = false
end

一切都是关于@value_proc。如果你提供一个 block ,它就会使用它;如果您不提供 block ,它会生成一个新的 lambda,将第二个参数发送到第一个参数。如果您仔细阅读源代码,您会看到 #matches? 方法,其中包含:

@actual_before = evaluate_value_proc
event_proc.call
@actual_after = evaluate_value_proc

其中 evaluate_value_proc 主要做 @value_proc.call

我认为“传统的”RSpec 会让您提供一个显式 block 。如果您在进行元编程,则双参数方法可能更有意义,但即便如此,您也可以使用 block 方法并自己调用send

关于ruby-on-rails - RSpec 'change' : Braces or brackets?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16546031/

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