正在加载...

fudge文档翻译-1

fudge是一个python的mock框架,我非常喜欢它。决定把文档翻译出来。水平有限。切勿吐槽。

Fudging a Web Service

当测试一个使用web服务的代码时,你可能想快速的设置一个不依赖于真实的在互联网上的web服务。这是一个使用mock对象的好的方式。假设你又一个Twitter的机器人,看起来像这样:

>>> import oauthtwitter
>>> def post_msg_to_twitter(msg):
...     api = oauthtwitter.OAuthApi(
...         '<consumer_key>', '<consumer_secret>',
...         '<oauth_token>', '<oauth_token_secret>'
...     )
...     api.UpdateStatus(msg)
...     print "Sent: %s" % msg
>>>

因为oauthtwitter是独立维护的,你的代码只要调用了正确的方法,就能正常工作。

A Simple TestCase

你可以使用一个假的声明的期望的class来代替OAuthApi的class,它这样用:

>>> import fudge
>>> @fudge.patch('oauthtwitter.OAuthApi')
... def test(FakeOAuthApi):
...     (FakeOAuthApi.expects_call()
...                  .with_args('<consumer_key>', '<consumer_secret>',
...                             '<oauth_token>', '<oauth_token_secret>')
...                  .returns_fake()
...                  .expects('UpdateStatus').with_arg_count(1))
...
...     post_msg_to_twitter("hey there fellow testing freaks!")
>>>

让我们来分解一下:

  1. 测试阶段,patch装饰器将用一个假的对象临时的打一个补丁。并且使它作为一个参数,传入到测试方法中。 这允许你添加你所想要的东西。

  2. 这里你看到的这个fake对象,期望有一个方法被调用,这个方法使用4个指定的字符串作为参数。它返回了一个对象实例(一个新的fake对象),它希望你使用一个参数调用fake_oauth.UpdateStatus()

  3. 最后, postmsgto_twitter() 被调用。

让我们运行测试!

>>> test()
Sent: hey there fellow testing freaks!

很高兴,它通过了。

Fudge让你声明了你想要的或松散或紧密的期望(expectations)。如果你不关心确切的参数,你可以不调用fudge.Fake.withargs()。如果你不关心方法是不是真的被调用,你可以用fudge.Fake.provides()来代替fudge.Fake.expects()。同样的,当你不想为真实的参数值而操心,可以使用fudge.Fake.witharg_count()。在其它方面有检测者,检测参数的值。