FlexMock Ruby单元测试mock库

简介: 编写测试的时候,可能需要和系统内的某个模块或系统外某个实体交互,例如数据库读写、邮件发送等。这时就需要使用 mock 技术来模拟。

FlexMockJim Weirich开发的Ruby单元测试mock库。

编写测试的时候,可能需要和系统内的某个模块或系统外某个实体交互,例如数据库读写、邮件发送等。这时就需要使用 mock 技术来模拟。


安装

gem install flexmock

简单的例子

我们有一个获取数据的类TemperatureSampler,从温度感应器中读取数据,并返回三次读取的平均值。当我们运行测试的时候,我们并没有真正的温度感性器,所以我们需要一个mock对象来响应read_temperature消息:

require'test/unit'

require'flexmock/test_unit'

classTemperatureSampler

 definitialize(sensor)

   @sensor = sensor

 end

 defaverage_temp

   total = (0...3).collect {

     @sensor.read_temperature

   }.inject { |i, s| i + s }

   total / 3.0

 end

end

classTestTemperatureSampler < Test::Unit::TestCase

 deftest_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


Test::Unit集成

FlexMock和Test::Unit配合良好,只需在测试文件的头部require一下flexmock/test_unit。然后使用flexmock方法来创建mock,创建的mock会在每个测试的结尾自动验证,然后结束。

例如:

require'flexmock/test_unit'

class TestDog < Test::Unit::TestCase

 deftest_dog_wags

   tail_mock = flexmock(:wag => :happy)

   assert_equal :happy, tail_mock.wag

 end

end


RSpec集成

RSpec集成也很简单:

RSpec.configure do |config|

   config.mock_with :flexmock

 end

 describe "Using FlexMock with RSpec"do

   it "should be able to create a mock"do

     m = flexmock(:foo => :bar)

     m.foo.should === :bar

   end

 end


创建局部mock

有时候我们希望mock对象中的一两个方法的行为,但是不改变该对象的其他部分。例如,假设我们有一个Dog对象,这个对象使用Woofer对象来咆哮:

classDog

 definitialize

   @woofer = Woofer.new

 end

 defbark

   @woofer.woof

 end

 defwag

   :happy

 end

end

现在我们想要测试Dog,但是不想使用真正的Woofer对象(因为Woofer会播放一段狗叫的音频,在测试时听到狗叫有点烦人)。

因此我们使用FlexMock来替换bark方法,这样我们就可以创建一个使用mock过的Woofer对象的Dog对象:

class TestDogBarking < Test::Unit::TestCase

 include FlexMock::TestCase

 # Setup the tests by mocking the +new+ methodof

 # Wooferandreturnamockwoofer.

 defsetup

   @dog = Dog.new

   flexmock(@dog, :bark => :grrr)

 end

 deftest_dog

   assert_equal :grrr, @dog.bark   # Mocked Method

   assert_equal :happy, @dog.wag    # Normal Method

 end

end

当测试结束后,被mock的方法会恢复它原来的状态。

这一技术的灵感来自于Mocha项目的Stuba库。


Mock类、对象

当然,我们也可以直接mock Woofer类返回mock:

classTestDogBarking < Test::Unit::TestCase

 include FlexMock::TestCase

 # Setup the tests by mocking the `new` method of

 # Woofer and return a mock woofer.

 defsetup

   flexmock(Woofer).should_receive(:new).

      and_return(flexmock(:woof => :grrr))

   @dog = Dog.new

 end

 deftest_dog

   assert_equal :grrrr, @dog.bark  # Calls woof on mock object

                                   # returned by Woofer.new

 end

end


Mock某个类创建的所有实例的行为

有时候mock单个对象是不够的,我们希望mock某个类创建的所有实例。用FlexMock很容易做到这点:

classTestDogBarking < Test::Unit::TestCase

 include FlexMock::TestCase

 # Setup the tests by mocking Woofer to always

 # return partial mocks.

 defsetup

   flexmock(Woofer).new_instances.should_receive(:woof => :grrr)

 end

 deftest_dog

   assert_equal :grrrr, Dog.new.bark  # All dog objects

   assert_equal :grrrr, Dog.new.bark  # are mocked.

 end

end

相关文章
|
8月前
|
Web App开发 计算机视觉 开发者
Ruby自动化:用Watir库获取YouTube视频链接
Ruby自动化:用Watir库获取YouTube视频链接
|
5月前
|
SQL 存储 Oracle
跨库迁移有多难?我们用 YashanDB YMP 做了个测试,效果惊艳了
异构数据库迁移常被视为企业数字化转型中的难题,涉及SQL兼容性、对象依赖顺序与数据一致性等关键环节。YashanDB Migration Platform(YMP)通过实际测试展示了卓越能力,从Oracle到YashanDB的迁移表现超预期。其亮点包括:零脚本全自动迁移逻辑、全面支持复杂对象(如存储过程、触发器)、高性能迁移速度远超传统方案。YMP提供评估、SQL转换、对象迁移、数据校验及可视化全流程管理,为企业平滑过渡至国产数据库提供了可靠选择。
跨库迁移有多难?我们用 YashanDB YMP 做了个测试,效果惊艳了
|
3月前
|
测试技术 Python
Python接口自动化测试中Mock服务的实施。
总结一下,Mock服务在接口自动化测试中的应用,可以让我们拥有更高的灵活度。而Python的 `unittest.mock`库为我们提供强大的支持。只要我们正确使用Mock服务,那么在任何情况下,无论是接口是否可用,都可以进行准确有效的测试。这样,就大大提高了自动化测试的稳定性和可靠性。
146 0
|
11月前
|
Java 测试技术 开发者
必学!Spring Boot 单元测试、Mock 与 TestContainer 的高效使用技巧
【10月更文挑战第18天】 在现代软件开发中,单元测试是保证代码质量的重要手段。Spring Boot提供了强大的测试支持,使得编写和运行测试变得更加简单和高效。本文将深入探讨Spring Boot的单元测试、Mock技术以及TestContainer的高效使用技巧,帮助开发者提升测试效率和代码质量。
981 2
|
7月前
|
存储 人工智能 编译器
【03】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-测试hello word效果-虚拟华为手机真机环境调试-为DevEco Studio编译器安装中文插件-测试写一个滑动块效果-介绍诸如ohos.ui等依赖库-全过程实战项目分享-从零开发到上线-优雅草卓伊凡
【03】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-测试hello word效果-虚拟华为手机真机环境调试-为DevEco Studio编译器安装中文插件-测试写一个滑动块效果-介绍诸如ohos.ui等依赖库-全过程实战项目分享-从零开发到上线-优雅草卓伊凡
287 10
【03】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-测试hello word效果-虚拟华为手机真机环境调试-为DevEco Studio编译器安装中文插件-测试写一个滑动块效果-介绍诸如ohos.ui等依赖库-全过程实战项目分享-从零开发到上线-优雅草卓伊凡
|
10月前
|
资源调度 前端开发 JavaScript
React 测试库 React Testing Library
【10月更文挑战第22天】本文介绍了 React Testing Library 的基本概念和使用方法,包括安装、基本用法、常见问题及解决方法。通过代码案例详细解释了如何测试 React 组件,帮助开发者提高应用质量和稳定性。
324 1
|
10月前
|
开发框架 安全 .NET
.NET使用Moq开源模拟库简化单元测试
.NET使用Moq开源模拟库简化单元测试~
134 0
|
12月前
|
测试技术 数据库连接 数据库
提升软件测试效率与灵活性:探索Mock测试的重要性
【9月更文挑战第20天】在软件测试领域,提升测试效率与灵活性至关重要。Mock 测试通过模拟外部组件,使模块能独立测试,缩短测试周期;快速反馈机制让测试结果即时可见,加速问题修复;还能模拟异常情况和进行参数化测试,增强测试全面性与灵活性,从而显著提高软件质量和开发效率。
161 9
|
Java 测试技术
SpringBoot单元测试快速写法问题之区分链路环节是否应该被Mock如何解决
SpringBoot单元测试快速写法问题之区分链路环节是否应该被Mock如何解决
|
IDE Java 测试技术
单元测试问题之Mockito 3.4mock静态方法如何解决
单元测试问题之Mockito 3.4mock静态方法如何解决
778 1

热门文章

最新文章