【问题标题】:Patching a function using Mock使用 Mock 修补函数
【发布时间】:2012-04-24 19:49:36
【问题描述】:

我有一个测试套件(使用nose,而不是unittest),我想修补一个函数来为测试类中的每个测试返回一个特定的值序列。我的第一次尝试是:

@patch('time.clock', MagicMock(side_effects=[1, 2]))
class Tests:
    def test_1(self):
        assert time.clock() == 1
        assert time.clock() == 2

    def test_2(self):
        assert time.clock() == 1
        assert time.clock() == 2

但是,MagicMock 实例只创建一次,所以当副作用耗尽时,第二次测试失败。我可以单独修补每个测试方法,但我真的不想在所有这些方法上复制补丁装饰器(有比这个例子中更多的测试!)我可以做的另一种方法是创建补丁设置代码如下:

class Tests:
    def setup(self):
        self.old_clock = time.clock
        time.clock = MagicMock(side_effects=[1, 2])

    def teardown(self):
        time.clock = self.old_clock

    def test_1(self):
        assert time.clock() == 1
        assert time.clock() == 2

    def test_2(self):
        assert time.clock() == 1
        assert time.clock() == 2

但保存和恢复原始函数定义似乎是 Mock 应该能够自动完成的事情。还有另一种我想念的方法吗?还是我的最后一个示例是最好的方法?

【问题讨论】:

    标签: python unit-testing mocking patch


    【解决方案1】:

    您应该只将补丁应用于每个测试,而不是将其应用于类:

    class Tests:
        @patch('time.clock', MagicMock(side_effects=[1, 2]))
        def test_1(self):
            assert time.clock() == 1
            assert time.clock() == 2
    
        @patch('time.clock', MagicMock(side_effects=[1, 2]))
        def test_2(self):
            assert time.clock() == 1
            assert time.clock() == 2
    

    【讨论】:

      【解决方案2】:
      a = (x for x in [1,2])
      
      x = lambda : next(a)
      
      x()
      

      输出:1

      x()
      

      输出:2

      将您的答案放入 a 的列表中。 将 X 更改为您想要的名称。

      【讨论】:

      • 我不知道你在这里得到什么。它似乎根本不涉及这个问题,并且看起来像是一种复杂的写作方式x = [1, 2].__iter__().next。你想说什么?
      • 好吧。您想要一种方法来创建函数的模拟。你现在是响应的顺序。不? x = ["Your first Response", "Your Second Respo", "...etc"].__iter__().next 解决问题。
      • 我知道如何创建迭代器和模拟函数。我的问题是是否有一种简单的方法可以为每个测试功能重置模拟。
      • 对不起,我误解了你的问题。您的 setup-teardown 解决方案对我来说看起来不错。它将“魔力”保留在测试中。易于理解、小巧且易于移除。
      猜你喜欢
      • 2012-05-03
      • 2014-09-02
      • 2012-06-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-19
      • 1970-01-01
      • 2013-08-15
      相关资源
      最近更新 更多