加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – 在Rails中设置rspec和黄瓜之间的界限

发布时间:2020-12-16 19:19:07 所属栏目:百科 来源:网络整理
导读:我喜欢Cucumber将用户规范连接到集成测试的方式.黄瓜部分或多或少对我来说很清楚. 当涉及到应该使用rspec(非集成测试)测试什么以及什么不应该测试时,我很挣扎. 使用已经使用Cucumber测试的rspec进行单元测试是否正确(例如,如果Cucumber测试失败,单元测试将10
我喜欢Cucumber将用户规范连接到集成测试的方式.黄瓜部分或多或少对我来说很清楚.
当涉及到应该使用rspec(非集成测试)测试什么以及什么不应该测试时,我很挣扎.
使用已经使用Cucumber测试的rspec进行单元测试是否正确(例如,如果Cucumber测试失败,单元测试将100%失败,如果Cucumber测试成功,单元测试将100%成功)?

具体来说,我有三个我想解决的例子.

>这是RSpec书中的一个案例.
他们有以下黄瓜方案:

Given I am not yet playing
When I start a new game
Then I should see "Welcome to Codebreaker!"
And I should see "Enter guess:"

他们在之后建立了两个rspec测试:

describe "#start" do
     it "sends a welcome message" do

     end
     it "prompts for the first guess" do

     end
end

>另一个示例是测试路由或操作重定向,同时存在以下情形:

Given I am at the login page
When I fill in the right username and password
Then I should be at the index page

>有时我们会测试已经使用Cucumber测试过的助手:

Given Mike has spent 283 minutes online
When I go to the Mike's profile page
Then I should see "4:43" for "Time online:"

我应该测试帮助者在“4:43”中打破283分钟,但事实证明它已经用黄瓜测试了.

它可能不是最好的例子,但它说明了我在说什么.
对我来说,那些测试是重复的.

你能否评论一下上面的例子?

当有黄瓜测试时,是否有关于应该用rspec测试什么的原则或指南?

解决方法

所有这些只是我对这个广泛而开放的话题的个人看法.有些人可能会不同意和有趣.

根据一般准则,您应该使用Cucumber来测试整个应用程序堆栈,这称为用户体验.此应用程序堆栈可能由许多较小的独立对象组成,但与使用您的应用程序的用户对这些细节不感兴趣相同,您的黄瓜测试不应该关注它们,而是将注意力集中在应用程序的外层.

另一方面,RSpec(在您的设置中!)应该主要关注那些小对象,构建应用程序的块.

书中的小应用示例存在一个很大的问题:它们很小!

应用程序外层与其内部之间的边界模糊不清.整个应用程序使用两个对象构建!很难区分应该测试什么.随着应用程序规模的扩大,用户体验测试(黄瓜)和对象状态测试/消息期望测试(RSpec)变得越来越明显.

使用你的第二个例子:

有了这个Cucumber的故事:

Given I am at the login page
When I fill in the right username and password
Then I should be at the index page

Rspec的:

你可能会有某种用户模型:

>测试用户名语法(例如必须以大写字母开头)
>测试密码必须是7个字符有数字等…

您可以拥有某种身份验证对象:

>测试有效和无效登录等
>测试异常被抛出….

如果您的身份验证数据库位于不同的服

> mock连接和身份验证数据库,并测试数据库是否从身份验证对象接收请求.

和yada yada yada …永远你的黄瓜测试将保护您的应用程序用户登录的一般目的.即使您在引擎盖下添加或更改行为,只要此测试通过,您就可以确信用户可以登录.

>你应该测试一次(在一个地方)
>对象负责测试其传入按摩(对象公共接口)的状态(返回值)
>当您的对象依赖于其他对象(发送其消息)时,请不要测试该对象对其负责的状态(返回值).
>当你的对象依赖于其他对象(发送它的消息)时,模拟第二个对象并测试它是否收到你的消息.

一般来说,你的问题太宽泛,你找不到一个答案,不同的人会有不同的想法.你应该关注的是尽可能好地测试,随着时间的推移,你一定会找到适合自己的方式.没有一个伟大的测试套装比没有好.

因为好的设计有助于编写好的测试我会推荐Sandix Metz的Practical Object-Oriented Design in Ruby: An Agile Primer(这是我读过的最好的书之一)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读