mocha是ruby下的一个mock框架。
关于mock object的相关信息,请参考:http://www.mockobjects.com/
关于mocha的相关信息,请参考:http://mocha.rubyforge.org/
基本概念及使用方法这里不谈,就谈谈最近在mocha碰到的两个小陷阱。
1.情况是这么个情况,完成了测试代码与功能代码后,我开始着手进行测试代码的重构(需要吗?不需要吗?)。首先,我盯上了刚完成测试代码时,就看着不爽的一段代码,这里整理如下:
def generate_some_mock_object(return1,return2)
mo=mock()
mo.stubs(:mock_method1).returns(return1)
mo.stubs(:mock_method2).returns(return2)
mo
end
这是我测试代码里的一个helper方法,用于生成一个mock对象,并stub了两个方法。味道是不怎么好,不是吗?于是,我决定重构她。扫了眼mocha的文档,发现mocha给出了一个mock对象生成的例子:
product = mock('ipod_product', :manufacturer => 'ipod', :price => 100)
哇哈哈,一个hash就搞定,而且还不用定义一个额外的局部变量,happy,动手将我的helper方法改为如下形式:
def generate_some_mock_object(return1,return2)
mock(:mock_method1 => return1,:mock_method2 => return2)
end
我happy的重新跑了一把测试,一串“F”出现在我面前,提示了一些诸如“expected call 1, not call 0”之类的错误。我就纳闷了,不都是生成一个mock对象,mock了两个stud方法么?why?仔细查看mocha文档和源代码,才发现通过mock(...)方法生成mock对象的时候,如果传递了一串excepted方法的hash时,mocha内部不用通过stubs(...)方法,生成stub方法,而是通过expects(...)方法。而expects(...)生成的方法在测试的时候必须进行调用,才认为测试通过,否则测试被认为失败的。而我的功能代码正好是只调用了{:mock_method1,:mock_method2}中的一个,所以造成测试失败。下面是mock(...)方法的源代码:
def mock(*arguments, &block)
name = arguments.shift if arguments.first.is_a?(String)
expectations = arguments.shift || {}
mock = name ? Mock.named(name, &block) : Mock.unnamed(&block)
mock.expects(expectations)
mocks << mock
mock
end
问题就出在mock.expects(expectations) 这句代码上。
难道没办法完成这次重构吗?当然不是,也怪我看文档不仔细,其实mocha为我们提供了另外一个生成mock对象的方法:stub(...) (注意:不要和stubs方法混淆),这里,使用stub方法,可以很轻松的完成我的重构,结果如下:
def generate_some_mock_object(return1,return2)
stub(:mock_method1 => return1,:mock_method2 => return2)
end
重新跑一遍测试,全是"...",那个happy啊。。。stub方法的源代码如下:
def stub(*arguments, &block)
name = arguments.shift if arguments.first.is_a?(String)
expectations = arguments.shift || {}
stub = name ? Mock.named(name, &block) : Mock.unnamed(&block)
stub.stubs(expectations)
mocks << stub
stub
end
发现关键所在的stub.stubs(expectations) 代码了吧?:)
PS:我发现mocha内部也有臭的迹象,mock和stub~呵呵
2.事情是这么个事情,后来,我盯上了这么一段测试代码,整理如下:
def generate_some_stub_method(return1,return2)
@my_object.stubs(:method1).returns(return1)
@my_object.stubs(:method2).returns(return2)
end
这里,@my_object不是一个mock对象,而是我实在的一个测试用的业务对象,这个helper方法无非就是为该对象生成两个stub方法,以供测试用。我仍然看她不怎么爽,同样,mocha的文档给了一个例子如下:
object.stubs(:method1 => :result1, :method2 => :result2)
继续happy,又可以合二为一了。于是,我将这个helper方法重构如下:
def generate_some_stub_method(return1,return2)
@my_object.stubs(:method1 =>return1,:method2 => return2)
end
我又happy着重新跑了一遍测试,居然提示我"{:method1 =>return1,:method2 => return2} is not a Symbol"。这个。。。老大,我承认,他绝对不是一个Symbol,但是你的示意代码和文档明明标明了stubs明明可以接受一个hash的方法集合啊?我有文档作证:
stubs(method_name) → expectation
stubs(method_names) → last expectation
并且,我查看源代码,她明明可以处理hash的啊。bug?但是我又错了。。。后来又仔细查看了mocha的源代码,发现,在mocha/object.rb文件中,有如下定义:
class Object
......
def stubs(symbol)
method = stubba_method.new(stubba_object, symbol)
$stubba.stub(method)
mocha.stubs(symbol, caller)
end
......
end
哦!问题出在这里!我前面说了,@my_object对象不是一个mock对象,而是一个普通的oject,我只是在这个普通的object上面搞了两个stub方法上去,自然,调用的是Object#stubs方法了,而不是Mock#stubs方法。原来如此~看来,这个重构完不成了,不过还好,不算太臭,就这么着贝~
OK!继续接下来的测试吧~:)
分享到:
- 2008-06-06 23:21
- 浏览 1464
- 评论(0)
- 论坛回复 / 浏览 (0 / 4216)
- 查看更多
相关推荐
11. 移除模块:Mocha Pro 3.3.0 提供了详细的移除模块参数设置,包括移除过程、移除中的问题、排解移除参数、关于移除的建议等内容。 12. 镜头模块:Mocha Pro 3.3.0 提供了详细的镜头模块参数设置,包括直线探测、...
文件列表中的"MOCHA"可能是Mocha工具的安装包或源代码文件,使用者需要按照Linux系统的安装步骤来解压并编译这个文件,以便在本地环境中运行Mocha。安装和使用过程中可能涉及到依赖库的安装、环境变量的设置以及编译...
通过"镜头跟踪教程.flv"这个视频教程,观众可以学习到如何利用mocha进行高效的镜头跟踪,理解跟踪的原理,掌握设置和优化技巧,并了解如何将跟踪数据应用到实际的合成工作中。这个教程对于提升VFX和后期制作技能是...
2. **反编译整个目录**:如果你有一个包含多个类的目录,Mocha可以一次性处理整个目录,生成对应的源代码文件。 3. **语法高亮和代码格式化**:Mocha生成的源代码通常会带有语法高亮和适当的缩进,使得阅读更加方便...
`ts-mocha` 是一个专为 TypeScript 设计的 Mocha 测试框架的封装工具,它使得开发者能够在 TypeScript 运行环境中直接执行测试,避免了在运行测试前进行编译的繁琐步骤。Mocha 作为一款流行的 JavaScript 测试框架,...
4. **数据导出**:完成追踪后,MOCHA的结果可以直接导入到After Effects中,或者以多种格式(如ALE、SMPTE VFX)导出,与其它后期制作软件兼容。 5. **时间伸缩和重定时**:对于需要改变视频速度的项目,MOCHA的...
mocha Pro v4支持多种主流的后期制作软件,如Adobe After Effects、Nuke、Avid Media Composer等,可以无缝嵌入到现有工作流程中。它支持导入和导出各种格式的数据,如Alembic、FBX、BMP等,便于与其他工具协作。 #...
Mocha 是一个流行的JavaScript测试框架,它为开发者提供了一个优雅的方式来组织和运行他们的测试用例。这个"mocha源代码"可能包含了Mocha的核心库、文档、示例、配置文件等资源,帮助我们深入理解Mocha的工作原理和...
Imagineersystems公司将其旗下三款软件Mocha、Monet、mokey并成一个新的 软件“MochaPro”。 Mocha PRO V4.0.0.8707集成视频运动跟踪,视频ROTO抠像,影视和广告特效合成, 清除工具(常见的电影和广告擦钢丝,移除...
在该压缩包中,除了Mocha Pro的安装程序外,还有两个文本文件——"CGLad-专业的素材分享网站.txt"和"更多优秀资源请访问.txt",这些文件可能是提供相关资源链接或推荐的网站信息,对于寻找其他后期制作素材和工具的...
要使用 `mocha-lcov-sourcemap-reporter`,首先需要在项目中安装这个库,可以使用 npm 进行安装: ```bash npm install --save-dev mocha-lcov-sourcemap-reporter ``` 接着,在 Mocha 的配置文件(通常是 `....
Mocha Pro 5.6 是一款由Imagineer Systems Ltd开发的专业级视觉特效软件,它在影视制作领域中广泛应用于跟踪、稳定、去除绿幕、物体移除以及镜头校正等任务。这个版本的软件特别值得一提的是,它结合了4.X版本的不...
Mocha telnet for java keygen
首先,用WINZIP等将"mocha-b1.zip" 解开得到"mocha.zip"文件,"mocha.zip"不须再解开,这个包内包括了反编译的类文件,只需将其拷贝到JDK所在的目录下,如:c:\ jdk\bin\ 此外,须设置路径:SET CLASSPATH=c:\my...
通过 `npm install mocha-logger` 或 `yarn add mocha-logger`,可以将这个库添加到项目中。然后,在 Mocha 测试文件中引入并使用它,以便在执行测试时获得丰富的日志输出。 总的来说,`mocha-logger` 是一个为前端...
标题 "mocha-client-tests_firefox_Mocha_addon_" 暗示了这是一个使用Mocha测试框架针对Firefox浏览器扩展(addon)进行客户端测试的项目。Mocha是JavaScript的一个流行测试库,它提供了丰富的功能来编写异步测试,...
mocha-loader, web service的mocha 加载程序模块 加载器允许加载 mocha 测试并通过 web pack运行安装npm install --save-dev mocha-loader用法插件配置( 推荐)webpack.confi
mocha-junit-reporter, mocha的JUnit报告器 mocha 报告器 生成junit样式XML测试结果。安装$ npm install mocha-junit-reporter --save-dev或者作为一个全局模块$ npm install -g moc
mocha-demos, 简单的mocha 演示集 这里 repo 用于我的文章 "示例的mocha 教程" ( 用中文) 。"mocha 是在 node.js 和浏览器上运行的丰富JavaScript测试框架,使异步测试变得简单和有趣。"-- Mochajs.org :如何使用
`mocha-tap-reporter` 是一个专门为Mocha测试框架设计的报告器,它允许开发者以TAP(Test Anything Protocol)格式输出测试结果。TAP是一种通用的、易于解析的测试结果格式,广泛用于自动化测试工具和持续集成系统,...