shared_examples_for "a measurable object" do |measurement, measurement_methods|
  measurement_methods.each do |measurement_method|
    it "should return #{measurement} from ##{measurement_method}" do
      subject.send(measurement_method).should == measurement
    end
  end
end

wc命令用来打印文件的文本行数、单词数、字节数等(print the number of newlines, words, and bytes in files)

格式:wc -l <file>

打印指定文件的文本行数。(l=小写L)

参数:-c, --bytes
打印字节数(print the byte counts)

参数:-m, --chars
打印字符数(print the character counts)

参数:-l, --lines
打印行数(print the newline counts)

参数:-w, --words
打印单词数(print the word counts)

启动参数

-p memcached监听的TCP端口
-l 监听的ip地址
-d 以daemon方式运行,将程序放入后台
-u memcached的运行用户
-P memcached的pid文件路径
-m memcached可以使用的最大内存数量
-c memcached同时可以接受的最大的连接数

如果你希望以socket方式来访问memcached,那么在启动的时候就必须去掉 -l和-p参数,并加上-s参数:

my_mock.should_receive(:sym).once
my_mock.should_receive(:sym).twice
my_mock.should_receive(:sym).exactly(n).times
my_mock.should_receive(:sym).at_least(:once)
my_mock.should_receive(:sym).at_least(:twice)
my_mock.should_receive(:sym).at_least(n).times
my_mock.should_receive(:sym).at_most(:once)
my_mock.should_receive(:sym).at_most(:twice)
my_mock.should_receive(:sym).at_most(n).times
my_mock.should_receive(:sym).any_number_of_times

nginx 405 Not Allowed
这个错误的原因是:Apache、IIS、Nginx等绝大多数web服务器,都不允许静态文件响应POST请求,否则会返回“HTTP/1.1 405 Method not allowed”错误。

如果使用默认页面缓存设置,在生产环境下,web服务器可以直接访问生成的缓存页面,不再去调用rails。

但是如果修改了默认页面缓的存放位置,又没对web服务器设置相应的规则,web服务器会因找不到页面而再次把请求转发给rails。从而使缓存变得没有意义。

启动mysql失败,提示Manager of pid-file quit without updating file.错误。从网上直接搜索错误信息,感觉出错原因及解决方案都不适用于本机的情况。

本着出错要查出其原因的原则,查看了mysql的出错日志(出错日志所在路径,请根据您自己机子的实际情况查找),发现错误信息:File ‘./mysql-bin.index’ not found (Errcode: 13),查看数据库文件,mysql-bin.index确实存在。

查看数据库文件的权限,发现全都变成了 drwx—— 2 1001 1001。突然想起之前重建过mysql用户,造成数据库文件的权限用户信息丢失。重新授权即可。

sudo chown -R  mysql var/
sudo chgrp -R  mysql var/

再次启动mysql,成功!

目前实践的环境是:同样的it描述在不同的context分组中可以执行各自的测试。如果换成是rails自带的test_开头的方法测试,如果同名肯定会异常。通过这一点又证明了rspec比test更好用的另一个方面。

  • TDD 用 test 思維,測試程式的結果
  • BDD 用 spec 思維,描述程式應該有什麼行為

rspec 检查类别方法

target.should be_a_kind_of(Array)
# target.class.should == Array

target.should be_an_instance_of(Array)
# target.class.should == Array

target.should response_to(:foo)
# target.response_to?(:foo).should == true

运行 spec/controller下的测试时,如果进入到spec/controller 目录下运行相关的spec,会出现undefined method get for #<ActiveSupport::TestCase::Subclass_1::Subclass_1:0xb6ec8cd4>这样类似的错误,解决方法居然是从项目的根目录运行,即spec spec/controller/action_controller_spec.rb。然后everything is ok.

解决方法是从一个老外的网站上找到,这里引用一下他的原话,看着这英文真是解气啊!

The problem was exactly in the path. I run my tests from spec/controllers folder where they didn’t work. From root folder everything goes right.

I found the solution, but i still don’t understand why, especially that my models tests works fine from user@user:~/application_folder/spec/models$ path

If you prefer to integrate views (a la rails functional testing) you can by including
the keyword/commmand “integrate_views”.

describe ArticlesController do
  integrate_views
  ...
end

期望改变值或抛出异常

expect {}.to change {}.from().to()

expect {}.to raise_error(YourMenthodError)

那么include和extend究竟有什么区别的?

引用如下

include : mixes in specified module methods as instance methods in the target class
extend : mixes in specified module methods as class methods in the target class

记得有看过的,被用到的时候居然忘记了。杯具啊!

Read more »

安装OpenSSH
Ubuntu缺省没有安装SSH Server,使用以下命令安装:

sudo apt-get install openssh-server openssh-client

首先下载imagemagick, 进入安装目录

cd imagemagick
./configure --prefix=/opt/imagemagick
make
sudo make install

如果出现

/usr/bin/ld: cannot find -lperl

请安装

sudo apt-get install libperl-dev