标签: ruby

对Rspec的`should_receive`有一个不那么具有侵入性的替代方案吗?

在编写Rspec测试时,我经常感到沮丧should_receive.我想知道是否有一个较少侵入性的选择.

例如:

describe "making a cake" do
  it "should use some other methods" do
    @baker.should_receive(:make_batter)
    @baker.make_cake
  end
end
Run Code Online (Sandbox Code Playgroud)

调用should_receive是一个很好的描述,但它会破坏我的代码,因为should_receive通过屏蔽原始方法来工作,并且make_cake除非make_batter实际返回一些电池,否则无法继续.所以我改成它:

@baker.should_receive(:make_batter).and_return(@batter)
Run Code Online (Sandbox Code Playgroud)

这很难看,因为:

  • 看起来像我的测试是make_batter正确返回@batter,但我居然强迫的仿版make_batter,以返回.
  • 它迫使我分开设置 @batter
  • 如果make_batter有任何重要的副作用(这可能是代码味道,我想)我也必须让这些发生.

我希望这should_receive(:make_batter)将验证方法调用并将其传递给原始方法.如果我想将其行为存根以进行更好的隔离测试,我会明确地这样做:@baker.stub(:make_batter).and_return(@batter).

有没有办法做一些像should_receive没有阻止原始方法调用?我的问题是设计糟糕的症状吗?

ruby rspec

42
推荐指数
3
解决办法
6250
查看次数

在RSpec-2.11中使用带有`expect`的隐式`subject`

使用expectrspec-2.11中的新语法,如何使用隐式subject?有没有比明确引用更好的方法subject,如下所示?

describe User do
  it 'is valid' do
    expect(subject).to be_valid    # <<< can `subject` be implicit?
  end
end
Run Code Online (Sandbox Code Playgroud)

ruby syntax rspec rspec2

42
推荐指数
3
解决办法
1万
查看次数

用于链接多行调用的Ruby约定

这有什么约定?

我使用下面的样式,但不确定它是首选的样式,因为如果我最后错过了一个点,我可能会遇到很多问题而没有意识到这一点.

query = reservations_scope.for_company(current_company).joins{property.development}.
  group{property.development.id}.
  group{property.development.name}.
  group{property.number}.
  group{created_at}.
  group{price}.
  group{reservation_path}.
  group{company_id}.
  group{user_id}.
  group{fee_paid_date}.
  group{contract_exchanged_date}.
  group{deposit_paid_date}.
  group{cancelled_date}.
  select_with_reserving_agent_name_for(current_company, [
                                       "developments.id as dev_id",
                                       "developments.name as dev_name",
                                       "properties.number as prop_number",
                                       "reservations.created_at",
                                       "reservations.price",
                                       "reservations.fee_paid_date",
                                       "reservations.contract_exchanged_date",
                                       "reservations.deposit_paid_date",
                                       "reservations.cancelled_date"
  ]).reorder("developments.name")
query.to_a # ....
Run Code Online (Sandbox Code Playgroud)

那么在多行链接方法的约定是什么?我更喜欢哪一种?

注意:我无法从Ruby编码风格指南中找到一个很好的例子.

ruby coding-style ruby-on-rails

42
推荐指数
4
解决办法
2万
查看次数

从Ruby中的URL获取文件名的好方法是什么?

从中提取的好方法是什么filename.jpg:

url = 'http://www.example.com/foo/bar/filename.jpg?2384973948743'
Run Code Online (Sandbox Code Playgroud)

我正在使用Ruby 1.9.3.

ruby url uri

42
推荐指数
3
解决办法
2万
查看次数

在Ruby中的第一个=符号后获取子字符串

纯粹出于好奇,是否有更优雅的方法来简单地获取字符串中第一个=符号后的子串?以下作品回馈name=bob:

string = "option=name=bob"
string[string.index('=')+1..-1]
Run Code Online (Sandbox Code Playgroud)

它只是感觉不是非常Ruby.这也有效:

string.split('=', 2)[1]
Run Code Online (Sandbox Code Playgroud)

再次,不是很优雅,特别是因为split做了额外的不必要的工作.正则表达式是答案吗?我觉得这对于在字符串中查找单个字符位置的简单性来说有点过分:

string.match('=(.*)')[1]
Run Code Online (Sandbox Code Playgroud)

我不得不想象这是一种极为常见的情况,是不是有string.after('=')类型方法?Ruby on Rails是否提供类似这样的事情,因为在网络上使用这种操作的频率?

更新:忘记在找不到符号时提及情况,nil或者返回空字符串.但是正则表达式机制和.index方法需要额外检查(因此不那么优雅).

ruby string

42
推荐指数
3
解决办法
5万
查看次数

Vim因ruby语法突出显示而变慢

我一直在使用vim over ssh工作一两个星期,一切都很顺利.今天我决定添加一些语法高亮,自动完成和其他一些通用插件.设置vundle并去上班.

我目前的.vimrc可以在https://github.com/scottopell/dotfiles/blob/master/.vimrc找到

我已将我的vimrc和vim文件克隆到我的本地ubuntu桌面上,vim运行完全符合预期,我找不到任何文件都没有慢.相同的插件和相同的vimrc,并且在ruby文件上没有慢.

更新

我可以使用以下.vimrc重现此问题

syntax on
Run Code Online (Sandbox Code Playgroud)

和一个空~/.vim文件夹.

但是,使用ruby/haml文件时,此vps上的vim非常慢.更多的红宝石文件.当我打开任何ruby文件时,启动大约需要2秒钟(使用--startuptime计时).使用可比较长度的haml文件,大约0.5秒.这种缓慢不仅仅是在启动时,移动和编辑文件都非常缓慢.

Haml/erb(它们基本相同)

268.818  000.005: before starting main loop
848.871  580.053: first screen update
Run Code Online (Sandbox Code Playgroud)

红宝石

199.613  000.004: before starting main loop
2937.859  2738.246: first screen update
Run Code Online (Sandbox Code Playgroud)

没有语法突出显示在上面相同的ruby文件上

149.047  000.004: before starting main loop
152.912  003.865: first screen update 
Run Code Online (Sandbox Code Playgroud)

我尝试过使用mosh(http://mosh.mit.edu)并没有帮助. 不再那么相关了

正如您在我的.vimrc文件中看到的,我已经尝试了一些不同的解决方案来解决这个问题.我已经尝试禁用所有插件运行(我将它们全部移动~/vim/bundle/PLUGINNAME~/vim/bundle/disabled/PLUGINNAME,这是正确的吗?),设置ruby路径,将foldlevel设置为手动,禁用我的colorscheme,没有任何帮助. 见edit3

我可以发布任何文件的完整startupttime日志,如果这将有所帮助.
我已经测试了一些其他语言(php,c,python,vimL),没有经历任何减速.


编辑:只是为了澄清,我正在运行ssh user @ server的ssh会话然后一次在服务器内我正在做vim file.rb.

EDIT2:我只是尝试直接访问服务器,并且缓慢持续没有ssh,我已经更新以反映这不是ssh的问题.

编辑3:我可以使用.vimrc文件重现该问题,该文件包含syntax on带有空〜/ .vim文件夹的单行

EDIT4 我卸载了我的编译版本的vim以及我可能通过apt安装的任何版本,手动删除了我系统中的所有vim内容,我可以运行vim vim …

ruby vim

42
推荐指数
5
解决办法
1万
查看次数

Errno :: ECONNREFUSED:拒绝连接 - 连接(2)动作邮件程序

很长一段时间以来,我一直在使用rails.现在我在ActionMailer中面临一个小问题.我想在用户注册时发送电子邮件以确认他的注册.我能够发送电子邮件中的发展模式,但如果作为没有生产模式.
异常Errno :: ECONNREFUSED:连接被拒绝 -每次调用传递方法时,connect(2)都会出现.
我写了以下代码.
我的SMTP配置看起来:
config.action_mailer.default_url_options = {:host =>"localhost:3000"}

  config.action_mailer.delivery_method = :smtp
  config.action_mailer.perform_deliveries = true
  config.action_mailer.raise_delivery_errors = true

  config.action_mailer.smtp_settings = {   
    :openssl_verify_mode => OpenSSL::SSL::VERIFY_NONE,      
    :ssl => true,
    :enable_starttls_auto => true,  #this is the important stuff!
    :address        => 'smtp.xxxx.xxx',
    :port           => xxx,
    :domain         => 'xxxxxx',
    :authentication => :plain,
    :user_name      => 'xxxxxxx@xxx.xxx',
    :password       => 'xxxxxxxxx'
  }
Run Code Online (Sandbox Code Playgroud)

在控制器中,我写了以下内容:

def confirm_registration_in_c       
 @user = User.find_by_email(asdf123@gmail.com)
 if @user
      UserMailer.confirm_registration(@user).deliver            
 end
end
Run Code Online (Sandbox Code Playgroud)

在我的user_mailer.rb中:

class …
Run Code Online (Sandbox Code Playgroud)

ruby ruby-on-rails actionmailer ruby-on-rails-3

42
推荐指数
4
解决办法
8万
查看次数

如何按字母顺序排列数组?

我正在使用Chris Pine的学习编程,并且我很难接受相对简单的挑战,即以随机单词列表的形式获取用户输入,然后在数组中按字母顺序排列.关于这个挑战的问题之前已经提出过,但是我无法在SO上找到我的具体问题,所以如果它是重复的,我很抱歉.

puts "Here's a fun trick. Type as many words as you want (one per line) and 
I'll sort them in...ALPHABETICAL ORDER! Hold on to your hats!"
wordlist = Array.new
while (userInput = gets.chomp) != ''
   wordlist.push(userInput)
end
puts wordlist.sort
Run Code Online (Sandbox Code Playgroud)

虽然这样做,但我试图弄清楚如何在没有区分大小写的情况下按字母顺序排列数组.这很难绕过我的脑袋.我了解到,casecmp但这似乎是一种比较特定字符串的方法,而不是字符串数组.

到目前为止,我一直在尝试这样的事情:

wordlist.to_s.downcase.to_a.sort!
Run Code Online (Sandbox Code Playgroud)

除了看起来不好之外,它还有多种原因,包括Ruby 2.0不允许将字符串转换为数组.

ruby alphabetical-sort

42
推荐指数
1
解决办法
3万
查看次数

警告:toplevel常量引用

我有四个模型(Document,Question,Question::DocumentAnswer).在我的Answer模型中,我有

validates :text,
  presence: { :unless => Proc.new{ |a| a.question.is_a? Question::Document } }
Run Code Online (Sandbox Code Playgroud)

这给了我警告

warning: toplevel constant Document referenced by Question::Document

如何防止发生此警告(不重命名我的课程)?

ruby ruby-on-rails ruby-on-rails-4

42
推荐指数
3
解决办法
2万
查看次数

Ruby相当于python尝试

我是编码的主要菜鸟.我开始学习Python,但不是粉丝,而是转向我喜欢的Ruby.现在我正在尝试将一些python代码转换为ruby而我陷入了python的"尝试"是一个相当于python的"尝试"的红宝石

ruby python language-comparisons try-catch

42
推荐指数
2
解决办法
2万
查看次数