如何只模拟测试对象中调用的一个方法

1 投票
1 回答
1055 浏览
提问于 2025-04-17 15:38

我想测试一个方法,但想把它调用的其他方法替换成假的。我做了一个简单的例子来说明这个概念:

class myClass():
    def one_method(self):
        print "hey"
    def two_deep(self):
        self.one_method()
    def three_deep(self):
        self.two_deep()

我使用了一个叫做Mox的Python模拟框架,写了以下代码来实现这个目标:

def test_partial(self):
        self_mox = mox.Mox()
        some_object = myClass()
        ## 1. make your mock                 
        my_mock = mox.MockObject(some_object)
        my_mock.one_method().AndReturn('some_value')
        self_mox.ReplayAll()
        ret = my_mock.three_deep()        ## *** SEE NOTE BELOW called "comment":
        self_mox.VerifyAll()

评论:

我原以为如果我在一个没有被覆盖的方法上调用这个模拟,那么它会默认使用原来的代码,这样我就能得到我想要的调用链,最后一个调用被替换……但实际上并不是这样。我搞不清楚怎么在一个没有插入方法的测试对象里嵌入一个模拟对象。

我查阅了部分模拟和链式模拟来解决这个问题,但找不到办法实现。

谢谢任何帮助 :)

-- 彼得

1 个回答

0

查看关于StubOutWithMock的文档:

https://code.google.com/p/pymox/wiki/MoxDocumentation#Stub_Out

https://code.google.com/p/pymox/wiki/MoxRecipes#Mock_a_method_in_the_class_under_test.

所以你需要的是:

def test_partial(self):
    self_mox = mox.Mox()   

    # Create the class as is, instead of doing mock.
    some_object = myClass()

    # Stub your particular method using the StubOutWithMock.
    m.StubOutWithMock(some_object, "one_method")
    some_object.one_method().AndReturn('some_value')

    self_mox.ReplayAll()
    ret = some_object.three_deep()
    self_mox.UnsetStubs()
    self_mox.VerifyAll()

撰写回答