我一直在努力使我的标准方法适应测试驱动.NET代码到Ruby.
作为一个例子,我正在写一个类:
grab all *.markdown files from a directory
foreach file:
extract code samples from file
save code to file.cs in output directory
Run Code Online (Sandbox Code Playgroud)
通常对于.NET,我最终会得到类似的东西:
class ExamplesToCode {
public ExamplesToCode(IFileFinder finder, IExampleToCodeConverter converter) { ... }
public void Convert(string exampleDir, string targetDir) { ... }
}
Run Code Online (Sandbox Code Playgroud)
在我的测试中(首先写的),我是模拟查找器和转换器.然后,我踩灭了finder.FindFiles("*.markdown")回说["file1", "file2"],检查converter.Convert("file1", targetDir)和converter.Convert("file2", targetDir)被调用.
我努力将这个应用于Ruby的地方是Ruby倾向于使用块和内部迭代器(例如array.each { |x| puts x }),并且包括模块而不是构造函数注入.我不确定如何在这些情况下对代码进行单元测试(没有设置完整的集成测试),而且.NET方法看起来非常不完美; 它似乎与Ruby自然运作的方式作斗争.
有关如何以Ruby方式执行此操作的任何建议?这个例子的Ruby测试的例子很棒.
假设我有一个对象Person,has_many :foos和:bars.
给定一个实例p(p = Person.new),我如何以编程方式确定可用的关系?
即 p.some_method => ["foo", "bar"]
我和我的朋友正在进行一些基本的Ruby练习以了解语言,我们遇到了一个我们无法理解的有趣行为.基本上,我们创建的tree数据类型只有一个类node,它只包含一个值和一个零或更多的数组nodes.我们正在使用rspec的autospec测试运行器.有一次,我们开始编写测试以禁止无限递归(循环树结构).
这是我们的测试:
it "breaks on a circular reference, which we will fix later" do
tree1 = Node.new 1
tree2 = Node.new 1
tree2.add_child tree1
tree1.add_child tree2
(tree1 == tree2).should be_false
end
Run Code Online (Sandbox Code Playgroud)
这是Node类:
class Node
attr_accessor :value
attr_reader :nodes
def initialize initial_value = nil
@value = initial_value
@nodes = []
end
def add_child child
@nodes.push child
@nodes.sort! { |node1, node2| node1.value <=> node2.value }
end
def == node
return (@value == node.value) && …Run Code Online (Sandbox Code Playgroud) 特定
class Category < ActiveRecord::Base
has_many :products, :order => 'name ASC'
end
Run Code Online (Sandbox Code Playgroud)
使用Rails 3堆栈,如何查询"拥有"产品的所有类别?
我正在编写一个Ruby扩展,我有一个标准的mkmf配置脚本,但我需要--std=c++0x在所有C++编译步骤中添加一个特殊的include flag().我不希望它在C编译步骤中,因为它会抛出警告.我该怎么做?
require 'mkmf'
create_makefile('thing')
Run Code Online (Sandbox Code Playgroud)
例如,我尝试过$CXXFLAGS << '-I..',但CXXFLAGS尚未定义.如果我使用$CXXFLAGS = '-I..'它,它稍后会被覆盖.
我rescue用于所有事情,而不仅仅是用于"拯救"例外.我的意思是,我只是喜欢它让我验证并仔细检查数据的方式.
举个例子,假设我有一个Item可能有或没有的模型User.然后,当我想获得我写的项目的所有者名称时:
item.user.name rescue ""
Run Code Online (Sandbox Code Playgroud)
而不是像
item.user.nil? ? "" : item.user.name
Run Code Online (Sandbox Code Playgroud)
它也是同样的想法,因为nil.name触发了我拯救的异常"",但我不确定这是一个好习惯.它制作了我想要的东西,它用更少的代码制作它,但是......我不知道,rescue这里和那里的所有单词都让我感到不安全.
这是一种不好的做法,还是滥用rescue关键字有效?
可能重复:
Rails 3已弃用的方法和API
有哪些资源(免费或付费)可以帮助您完成将Ruby on Rails 2应用程序迁移到Rails 3的过程?我在RoR网站上看到过一些博客文章(其中一些看起来已经过时)和一本电子书出售,但是你能推荐什么作为从版本2到版本3的变化的准确和完整的解释以及需要什么移植到Rails 3环境时要更新?
我知道Twitter最初是在Ruby on Rails平台上运行的.
今天这是真的吗?
我试图为ActiveRecord模型提供一组非常通用的命名范围,如下所示:
module Scopes
def self.included(base)
base.class_eval do
named_scope :not_older_than, lambda {|interval|
{:conditions => ["#{table_name}.created_at >= ?", interval.ago]
}
end
end
end
ActiveRecord::Base.send(:include, Scopes)
class User < ActiveRecord::Base
end
Run Code Online (Sandbox Code Playgroud)
如果命名范围应该是通用的,我们需要指定*table_name*以防止命名问题(如果它们是来自其他链式命名范围的连接).
问题是我们无法获取table_name,因为它在ActiveRecord :: Base上调用,而不是在User上调用.
User.not_older_than(1.week)
NoMethodError: undefined method `abstract_class?' for Object:Class
from /var/lib/gems/1.8/gems/activerecord-2.3.5/lib/active_record/base.rb:2207:in `class_of_active_record_descendant'
from /var/lib/gems/1.8/gems/activerecord-2.3.5/lib/active_record/base.rb:1462:in `base_class'
from /var/lib/gems/1.8/gems/activerecord-2.3.5/lib/active_record/base.rb:1138:in `reset_table_name'
from /var/lib/gems/1.8/gems/activerecord-2.3.5/lib/active_record/base.rb:1134:in `table_name'
from /home/bogdan/makabu/railsware/startwire/repository/lib/core_ext/active_record/base.rb:15:in `included'
from /var/lib/gems/1.8/gems/activerecord-2.3.5/lib/active_record/named_scope.rb:92:in `call'
from /var/lib/gems/1.8/gems/activerecord-2.3.5/lib/active_record/named_scope.rb:92:in `named_scope'
from /var/lib/gems/1.8/gems/activerecord-2.3.5/lib/active_record/named_scope.rb:97:in `call'
from /var/lib/gems/1.8/gems/activerecord-2.3.5/lib/active_record/named_scope.rb:97:in `not_older_than'
Run Code Online (Sandbox Code Playgroud)
如何在Scopes模块中获取实际的table_name?
最近,当我运行它来编辑ruby文件或rails项目时,vim需要很长时间才能启动.但是在纯文本文件上调用时它会快速启动.有没有办法找出哪些ruby vim插件最有助于延长启动时间?