正在加载...

fudge文档翻译-3

Cascading Objects

你可能想让一些对象用长的链式的工作。这有一个使用fudging SQLAlchemy级联查询的例子。注意 Fake.returns_fake() 指定于session.query(User)返回一个新的对象。同样注意因为query()返回一个迭代器,它设置返回一个fake用户对象的列表。

>>> import fudge
>>> session = fudge.Fake('session')
>>> query = (session.provides('query')
...                 .returns_fake()
...                 .provides('order_by')
...                 .returns(
...                     [fudge.Fake('User').has_attr(name='Al', lastname='Capone')]
...                 )
... )
>>> from models import User
>>> for instance in session.query(User).order_by(User.id):
...     print instance.name, instance.lastname
...
Al Capone

Multiple Return Values

我们说,你想测试需要调用多次和返回多个结果的代码。到现在,你仅仅看到Fake.returns()方法将返回一个无穷值(value infinitely)。要改变它,调用To change that, 调用Fake.next_call()可以指定调用顺序。这是一个购物车场景的例子:

>>> cart = (fudge.Fake('cart')
...              .provides('add')
...              .with_args('book')
...              .returns({'contents': ['book']})
...              .next_call()
...              .with_args('dvd')
...              .returns({'contents': ['book', 'dvd']}))
>>> cart.add('book')
{'contents': ['book']}
>>> cart.add('dvd')
{'contents': ['book', 'dvd']}
>>> cart.add('monkey')
Traceback (most recent call last):
...
AssertionError: This attribute of fake:cart can only be called 2 time(s).

Expecting A Specific Call Order

你可能需要测试一个对象,预计它在一个特定的顺序中作为一个方法被调用。仅仅在调用fudge.Fake.expects()之前带使用fudge.Fake.remember_order(),就像这样:

>>> import fudge
>>> session = (fudge.Fake("session").remember_order()
...                                 .expects("get_count").returns(0)
...                                 .expects("set_count").with_args(5)
...                                 .expects("get_count").returns(5))
...
>>> session.get_count()
0
>>> session.set_count(5)
>>> session.get_count()
5
>>> fudge.verify()

如果你没有按照顺序调用,讲输出一个描述性的错误。

>>> session.set_count(5)
Traceback (most recent call last):
...
AssertionError: Call #1 was fake:session.set_count(5); Expected: #1 fake:session.get_count()[0], #2 fake:session.set_count(5), #3 fake:session.get_count()[1], end