有webservice参与的系统的单元测试, 使用mock object (三)

经过近4个工作日的整理,终于把整个系统基本都搞定:

[quote="使用了MOCK"]Finished in 32.84 seconds
390 examples, 0 failures, 6 pending[/quote]

[quote="原来的"]Finished in 21 minutes 11.65 seconds
421 examples, 13 failures[/quote]


现在33秒,对比以前的 20+ 分钟,好了太多了,起码不怕运行单元测试的时候睡着了。。。

6个pending ,是因为 难于MOCK。 例如: 使用了delayed_job, 调用者 与被调用者之前隔了4,5层关系,又来来回回参合了好几个delay_job,对象啥的。

一点儿心得:

1. 跟 double 相比, 手写的mock 对象非常给力. 例如:

原始对象:

class Banana
def color
"yellow"
end
end


Mock对象

class MockBanana
def color
"color in MOCK mode"
end
end


(或许,上述代码可以写成: )

# 更多,见:https://www.relishapp.com/rspec/rspec-rails/docs/mocks/mock-model
mock_banana = double("Banana"){ :color => "color in MOCK mode"}


2. mock, stub 要混合使用。 两者适合不同的粒度: mock object, stub method.
不能认准一个不放。

3. 要使系统可以在 MOCK 和 正常模式下转换,例如: 加上一个条件限制:

it "balabala@balala.com should not exists in remote server" do
DeviceResource.any_instance.stub(:find){ [] } if ENV['with_real_webservice'] != "true"
get :check_if_exists_in_server, :email => "balabala@balala.com"
response.body.should == "false"
end

然后调用的时候,可以有两种方式:
$ rspec spec
$ with_real_webservice=true rspec spec

4. 某些难于测试的方法,可能是由于设计太难造成,也可能是由于引入了 外部系统的原因造成。 解决办法是使用 设计模式 来让代码变整洁/简单/.

5. 最后, stub 的一点儿用法:

class Banana
def color
"yellow"
end
def self.size
"big"
end
end

# stub class method
Banana.stub(:size) { "super big"}

# stub instance method
Banana.new.stub(:color) { "green" }
Banana.any_instance.stub(:color) { " always yellow" }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值