现在的位置: 首页 > 综合 > 正文

pMock API概览

2014年01月18日 ⁄ 综合 ⁄ 共 3182字 ⁄ 字号 评论关闭

    虽然以前没做过翻译,但是还是知道翻译是讲究信达雅的,但是如果使翻译无法达到完美的境界时,我们必须有所舍弃,因此,有两种情况,一,把信看得最重要;二,把达看得最重要,为啥没有雅呢?因为雅是在达的基础上才能够实现。也许是因为受够了第一种情况的译文,所以,我翻译的过程中追求达的标准。所以,可能会与原文意思相差比较大,甚至多说了少说了,意思也是按照我理解的意思翻译过来的。
    不好意思,本人大学英语四级没过,翻译有错误在所难免,如若发现错误,恳请指出,谢谢。还有两句不知道怎么翻译好,如果有好的译文,也恳请告知,谢谢。

创建mocks对象

在单元测试中我们会使用Mock对象来代替真实的对象。当真实对象很难被构建,或者尚未被实现,或者会引起其它的副作用的时候,这时更适合使用一个mock对象。

    import pmock
    ...
    mock = pmock.Mock()

生成一个mock对象就是这么简单。

    mock.expects(pmock.once()).render()

这样就可以调用mock对象设置的模拟方法了。

    mock.render()

如果调用一个mock对象未被设置的方法将会抛出一个异常。

当mock对象被设置了之后,在单元测试中使用它们就跟被模拟的对象一模一样。

    pictures = [mock]
    gallery = Gallery(pictures)
    gallery.render()

After the test's normal assertions have been made, an assertion that the mock's expectations have been satisfied should be made.

    mock.verify()

如果mock对象的预期行为没有被执行,比如一个模拟方法没有被调用,那么如果调用verfify()方法将会抛出一个异常。

设置模拟方法的参数

我们可以对mock对象的模拟方法的参数进行预设,就像这样:

    mock.expects(pmock.once()).render(pmock.eq(640), pmock.eq(480))

这种做法能够约束模拟方法的参数。如果参数不符合约束条件,将无法得到预期的结果。

    mock.expects(pmock.once()).render(brush=pmock.same(print.BIG_BRUSH))

如果想要更灵活的方式,可以使用一些更细节但略显麻烦的方法,如下:

    mock.expects(pmock.once()).method("render") # any arguments allowed
    mock.expects(pmock.once()).method("render").with_at_least(brush=pmock.same(print.BIG_BRUSH))

--------------------------
设置模拟方法调用的次数

expects()函数的参数定义了被模拟方法的调用次数,例如:
    mock.expects(pmock.once()).boil()
    mock.expects(pmock.at_least_once()).simmer()
    mock.expects(pmock.never()).fry()

设置模拟方法的调用顺序

同一个mock对象的模拟方法的调用顺序可以使用after()方法来设置,例如:

    mock.expects(pmock.once()).invalidate()
    mock.expects(pmock.once()).render().after("invalidate")

除了上述使用方法的名字外,我们还可以使用id()方法设置一个Tag,然后跟上面一样使用after()方法来设置顺序,例如:

    mock.expects(pmock.once()).add(pmock.eq(10)).id("add #1")
    mock.expects(pmock.once()).add(pmock.eq(15)).id("add #2").after("add #1")
    mock.expects(pmock.once()).add(pmock.eq(5)).after("add #2")

在有多个mock对象的时候,也可以设置顺序,例如:

    other_mock = pmock.Mock()
    other_mock.expects(pmock.once()).add()
    mock = pmock.Mock()
    mock.expects(pmock.once()).sum().after("add", other_mock)

模拟方法的行为 

模拟方法的行为可以通过will()方法来设置,例如:

    mock.expects(pmock.once()).calculate().will(pmock.return_value(20))
    mock.expects(pmock.once()).consume().will(pmock.raise_exception(RuntimeError("invalid")))

Stubs

Stubs 允许模拟方法可以被调用任意次数,并且mock对象的验证检查不适用于Stubs。

    mock.stubs().sleep().will(pmock.return_value(True))

未定义方法的默认行为

当一个未定义的模拟方法被执行时会抛出一个异常,我们可以通过使用set_default_stub()方法设置默认的行为来避免抛出此异常,例如:

    mock.set_default_stub(pmock.return_value("legs"))
    mock.crazy()

From imports

可以使用下面的方式使得导入pmock模块更方便简单:

    from pmock import *

    mock = Mock()
    mock.expects(once()).calculate(eq(34), eq(2)).will(return_value(68))

基类

MockTestCase类是测试模块的基类。 It provides the mock method for creating mock objects that will be automatically verified after the test method has run. The verify calls are made to the mock object after tearDown has been called.

    class FooTest(pmock.MockTestCase):

        def test_involving_mocks(self):
            bar = self.mock()
            bar.expects(pmock.once()).baz()
            qux.quux(bar)
            # no need for verify call as its done by MockTestCase

进一步了解

如果你想弄清楚yMock模块的其他行为,可以查看验收测试部分(http://cvs.sourceforge.net/viewcvs.py/pmock/pmock/src/acceptance_tests.py)。

mock objects jmock网站包含更多mock对象和相关测试技术的使用方法。

Martin Fowler写了一篇关于mock对象和它们在单元测试中的使用风格(http://martinfowler.com/articles/mocksArentStubs.html)。 



抱歉!评论已关闭.