Bed*_*sso 16 ruby rspec ruby-on-rails capybara
在阅读Michael Hartl撰写的Ruby On Rails教程时,在作者编写集成测试以验证其注册页面的部分中,他使用了代码spinet吼叫.我得到了代码所做的但却无法理解"如何"部分,即无法理解执行顺序.
expect { click_button "Create my account" }.not_to change(User, :count)
Run Code Online (Sandbox Code Playgroud)
有人可以解释上述方法和块链的语义以及它们如何组合在一起吗?
Rob*_*vis 45
您将用于expect ... change验证特定方法调用是否更改 - 或不更改 - 其他一些值.在这种情况下:
expect { click_button "Create my account" }.not_to change(User, :count)
Run Code Online (Sandbox Code Playgroud)
将导致rspec执行以下操作:
User.count并记下返回的值.(这可以指定为接收器和方法名称,如(User, :count)您的示例中所示,或者作为任意代码块,如{ User.count }.click_button "Create my account"这是一个模拟鼠标点击链接的Capybara方法.User.count一次.其他使用方法expect ... change:
expect { thing.destroy }.to change(Thing, :count).from(1).to(0)
expect { thing.tax = 5 }.to change { thing.total_price }.by(5)
expect { thing.save! }.to raise_error
expect { thing.symbolize_name }.to change { thing.name }.from(String).to(Symbol)
Run Code Online (Sandbox Code Playgroud)
有些文档在这里.
它是如何做到这一点有点神秘,并没有必要了解它如何使用它.调用expect是使用rspec自己的自定义DSL和"匹配器"系统定义rspec执行的结构.加里·伯恩哈特(Gary Bernhardt)有一个相当简洁的截屏视频,他认为rspec的神秘感实际上是从像红宝石这样的动态语言中脱颖而出.这不是一个很好的使用 rspec的介绍,但如果你对它的工作原理感到好奇,你可能会发现它很有趣.
UPDATE
看到你对另一个答案的评论后,我将添加一些关于操作顺序的内容.不直观的技巧是它是执行所有块的匹配器(change在这种情况下).expect有一个lambda,not_to是一个别名,should_not其作用是将lambda传递给匹配器.在这种情况下,匹配器change知道执行一次自己的参数,然后执行它传递的lambda(来自的那个expect),然后再次运行自己的参数以查看是否有变化.它很棘手,因为它看起来应该从左到右执行,但由于大多数部分只是传递代码块,所以它们可以并且将它们拖放到对匹配器最有意义的任何顺序.
我不是rspec内部的专家,但这是我对基本思想的理解.
| 归档时间: |
|
| 查看次数: |
9685 次 |
| 最近记录: |