Ruby单元测试mock库:FlexMock
jopen
11年前
FlexMock是一个比较流行的针对Rails单元测试的Mock工具。
编写测试的时候,可能需要和系统内的某个模块或系统外某个实体交互,例如数据库读写、邮件发送等。这时就需要使用 mock 技术来模拟。简单的例子
我们有一个获取数据的类TemperatureSampler
,从温度感应器中读取数据,并返回三次读取的平均值。当我们运行测试的时候,我们并没有真正的温度感性器,所以我们需要一个mock对象来响应read_temperature
消息:
require 'test/unit' require 'flexmock/test_unit' class TemperatureSampler def initialize(sensor) @sensor = sensor end def average_temp total = (0...3).collect { @sensor.read_temperature }.inject { |i, s| i + s } total / 3.0 end end class TestTemperatureSampler < Test::Unit::TestCase def test_sensor_can_average_three_temperature_readings sensor = flexmock("temp") sensor.should_receive(:read_temperature).times(3). and_return(10, 12, 14) sampler = TemperatureSampler.new(sensor) assert_equal 12, sampler.average_temp end end