使用Mock修补函数

aqu*_*tae 5 python unit-testing patch mocking

我有一个测试套件(使用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
Run Code Online (Sandbox Code Playgroud)

但是,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
Run Code Online (Sandbox Code Playgroud)

但保存和恢复原始函数定义似乎是Mock应该能够自动执行的操作.有没有另外一种方法可以解决这个问题?或者我的最后一个例子是这样做的最佳方式?

Nas*_*gar 2

a = (x for x in [1,2])

x = lambda : next(a)

x()
Run Code Online (Sandbox Code Playgroud)

输出:1

x()
Run Code Online (Sandbox Code Playgroud)

输出:2

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