今天写一些rspec时,我遇到了一些意外行为,将Date(和Time)实例与nil进行比较.这是使用原始ruby(没有Rails或其他库)的示例:
user@MacBook-Work ~ $ ruby -v
ruby 1.8.7 (2008-08-11 patchlevel 72) [universal-darwin10.0]
user@MacBook-Work ~ $ irb
>> 1 == nil
=> false
>> "string" == nil
=> false
>> :sym == nil
=> false
>> false == nil
=> false
>> [] == nil
=> false
>> {} == nil
=> false
>> Proc.new {} == nil
=> false
Run Code Online (Sandbox Code Playgroud)
到目前为止,这么好,对吗?
>> Date.new == nil
=> nil
>> Time.new == nil
=> nil
Run Code Online (Sandbox Code Playgroud)
Date确实实现了自己的===,这很好用:
>> Date.new === nil
=> false
Run Code Online (Sandbox Code Playgroud)
有没有解释为什么会发生这种情况或为什么这是理想的行为?==似乎是从Comparable实现的.==,但是关于它的文档没有任何迹象表明它会返回nil.对此有何设计决定? …
我想生成SHA512散列密码,以便直接包含在/ etc/shadow文件中,以便与chef的用户资源一起使用.通常我会去stdlib的Digest库,但它不会以正确的格式生成哈希:
ruby-1.9.2-p136 :001 > require 'digest/sha2'
=> true
ruby-1.9.2-p136 :002 > Digest::SHA512.hexdigest('test')
=> "ee26b0dd4af7e749aa1a8ee3c10ae9923f618980772e473f8819a5d4940e0db27ac185f8a0e1d5f84f88bc887fd67b143732c304cc5fa9ad8e6f57f50028a8ff"
Run Code Online (Sandbox Code Playgroud)
shadow文件想要的格式是:
$6$/ShPQNXV$HJnibH9lw01qtYqyJQiBf81ggJB2BGUvKA7.kv39HGCeE.gD4C/SS9zAf5BrwOv3VJzvl99FpHYli9E8jykRC0
Run Code Online (Sandbox Code Playgroud)
我看过的事情:
为了比较,返回正确格式的东西是PHP的crypt,但我宁愿不必向PHP执行简单的操作.
从Rails 3/Rspec 2开始,我试图利用控制器规范的render_views功能.我遇到的问题是我们刚刚安装了kaminari寻呼机gem,我想<%= paginate @sites %>从我的视图中删除调用,所以我不必手动删除kaminari在集合中定义的所有内部方法与paginate帮助者一起使用.
如果这是在视图规范中,我可以通过调用来删除辅助方法view.stub(:paginate),但是我找不到任何方法来从控制器规范(例如controller.view.stub(:paginate))获取视图对象的句柄.有没有办法做到这一点,或者我们可以选择禁用此方法的render_views,或者存储一堆与我们无关的内部kaminari方法(因为它们应该被kaminari的测试覆盖,并且可能会改变未来的版本)?
describe SitesController do
render_views
def mock_site(stubs={})
@mock_site ||= mock_model(Site, stubs).as_null_object
end
describe "GET index" do
it "assigns all sites as @sites" do
Site.stub_chain("enabled.ordered.page") {[mock_site]}
# want to do something here like: controller.view.stub(:paginate)
get :index
assigns(:sites).should eq([mock_site])
end
end
end
Run Code Online (Sandbox Code Playgroud)