RSpec测试框架

#参考http://www.slideshare.net/ihower/rspec-7394497
#入门,框架
require 'rspec'

class Order
#自定义类
end

describe Order do #一个类别

#可以Nested加入想要测试的方法是哪个
describe "#amount" do #通常用#开头表示实例方法,.开头表示类方法
context "when user is vip" do #可以再nested加入不同情境

before(:each) do #每段it之前执行,before(:all)整段describe执行一次
@user = User.new(:is_vip => true)
@order = Order.new(:user => @user)
end
it "should discount five percent if total > 1000" do #每个it就是一小段测试
#should 和 should_not
true.should == false
end

it "should discount ten percent if total > 1000" do #每个it就是一小段测试
pending #可以先列出来打算要写的测试
end

after(:each) do #每段it执行之后,after(:all)整段describe执行一次

end
end

context "when user is not vip" do
it "should discount three percent if total > 1000" do #每个it就是一小段测试

end
end
end

end

describe "A Order" do #另一个类别
context "another test" do

let(:user) { User.new(:is_vip => false)} #Lazy。let(:name){...}有需要才会运算,相较于before增加执行速度,let!则是非lazy版

end


end


target.should be_true #=target.should be_true
还有be_false,be_nil等
target.should be_a_kind_of(Array)#target.class.should == Array
还有be_an_instance_of,respond_to
have_key,include,have(3).items # items.length == 3
任何be_开头
target.should be_empty #target.empty?.should == true
target.should be_blank #target.blank?.should == true
target.should be_admin #target.admin?.should == true

expect 和 to 期望一段程序会改变某个值或抛出异常

it "should ..." do
expect {
order.ship!
}.to chang {order.status}.from("new").to("shipping")

end
上面的跟下面的版本的一样
it "should..." do
order.status.should == "new"
order.ship!
order.status.should == "shipping"

end

异常

expect {
order.paid? = false
order.ship!
}.to raise_error(NotPaidError)

另一版
lambda {
order.paid? = false
order.ship!
}.should_raise(NotPaidError)


使用subject可省略receiver

describe Order do
subject {Order.new(:status => "new")}

it{ should be_valid } # subject.vaild?.should == true

its(:status){should == "New"} #its可以省略receiver

specify{should be_valid} #一些别名,与it一样
example{should be_valid}
end

总结:一些惯例
1、一个rb文件配一个_spec.rb文件,
容易找,watchr等工具容易设定,editor有支援快捷键
2、输出格式
rspec filename.rb 不产生文件
rspec filename.rb -fs 输出spcdoc文件
rspec filename.rb -fh 输出html文件

已经入门了,继续进阶...
RSpec Mock 使用假物件替换真的物件
Stub
回传设定好的值

@user = stub("user")
@user.stub(:name).and_return("ihower")
@user.name #"ihower"

@customer = stub("customer").as_null_object
@customer.foobar #nil

@client = stub("client")
@client.stub_chain(:foo, :bar, :baz).and_return("blah")
@client.foo.bar.baz #"blah"


用来测试最后的状态
describe "#receiver_name" do
it "should be user name" do
user = stub(:user)
user.stub(:name).and_return("ihower")

order = Order.new(:user => user)
order.receiver_name.should == "ihower"
end
end

Mock 如果没有呼叫到就算失败

@gateway = mock("ezcat")

@gateway.should_reveive(:deliver).with(@user).and_return(true)
@gateway.deliver

一般测试流程
>Given给定条件
>When当事件发生
>Then则结果要是如何

Mock测试流程
>Given给定条件
>Expect预期会发生什么事
>When当事件发生

一般测试是检查物件的最后状态
Mocks可以让我们测试物件之间的行为
Mocks Aren't Stubs 请看http://martinfowler.com/articles/mocksArentStubs.html


原文后面还介绍很多东西,这里就不列举了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值