python mox使用方法(3)

  现在来制造一些异常情况!

  首先,声明一个异常。

class ZooException(Exception):
    pass

然后修改我们的测试用例,并且来捕获这个异常。

    def test_feed(self):
        zookeeper = self.m.CreateMock(zoo.ZooKeeper)
        zookeeper.feed(mox.StrContains("penguin"))
        zookeeper.feed(mox.StrContains("swan")).AndRaise(zoo.ZooException)
        z = zoo.Zoo(zookeeper)

        self.m.ReplayAll()
        with self.assertRaises(zoo.ZooException):
            z.feed()
        self.m.VerifyAll()

  这里能看到zoo的feed函数抛出了一场zoo.ZooException.

  现在将类zookeeper设定的再复杂一点,让它也包含一些自己的内部变量。类似于设定饲养员是被雇佣于一家Vendor。

class ZooKeeper(object):
    def __init__(self, name):
        self.name = name
        self.vendor = Vendor()

    def feed(self, animal):
        print "feed animal %s" % animal

class Vendor(object):
    def get_name(self):
        return "Elet Cop, Ltd."


  我们在类Zoo中添加一个函数get_zookeeper_vendor来查看饲养员所从属的vendor

    def get_zookeeper_vendor(self):
        name = "Vendor:%s" % self.zookeeper.vendor.get_name()
        return name

   测试用例如下:

    def test_get_zookeeper_vendor(self):
        zookeeper = self.m.CreateMock(zoo.ZooKeeper)
        z = zoo.Zoo(zookeeper)

        self.m.ReplayAll()
        self.assertEqual("Vendor:Elet Cop, Ltd.", z.get_zookeeper_vendor())
        self.m.VerifyAll()

运行却会得到错误:

UnknownMethodCallError: Method called is not a member of the object: vendor

这是因为zookeeper本身已经是mock过的,对于被调用过的内部参数,也应该一并mock后才能使用。

   
    def test_get_zookeeper_vendor(self):
        zookeeper = self.m.CreateMock(zoo.ZooKeeper)
        vendor = self.m.CreateMock(zoo.Vendor)
        vendor.get_name().AndReturn("Test Cop, Ltd.")
        zookeeper.vendor = vendor
        z = zoo.Zoo(zookeeper)

        self.m.ReplayAll()
        self.assertEqual("Vendor:Test Cop, Ltd.", z.get_zookeeper_vendor())
        self.m.VerifyAll()


mox还提供了一个方法MockAnything(),可以用来做任何函数的mock,用法类似。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值