Unit testing 模拟来自2个不同文件的2个类

Unit testing 模拟来自2个不同文件的2个类,unit-testing,mocking,python-3.7,Unit Testing,Mocking,Python 3.7,我有一个班级模拟的例子: worker.py 和一个测试文件:test_worker.py 只要这两个类在同一个文件中,测试就会返回ok。将它们分为两个文件,分别为类助手的worker_1.py和类worker的worker_2.py,测试失败: AssertionError: 'db' != 'testing' 为什么??我该如何纠正这种行为 谢谢假设我们有两个文件,worker.py和helper.py worker.py: from helper import Helper class

我有一个班级模拟的例子:

worker.py

和一个测试文件:test_worker.py

只要这两个类在同一个文件中,测试就会返回ok。将它们分为两个文件,分别为类助手的worker_1.py和类worker的worker_2.py,测试失败:

AssertionError: 'db' != 'testing'
为什么??我该如何纠正这种行为


谢谢

假设我们有两个文件,worker.py和helper.py

worker.py:

from helper import Helper

class Worker:
    def __init__(self):
        self.helper = Helper('db')

    def work(self):
        path = self.helper.get_path()
        print('Working on {path}')
        return path
from unittest import TestCase, mock

from worker import Worker

class TestWorkerModule(TestCase):
    def test_patching_class(self):
        with mock.patch('helper.Helper') as MockHelper:
            MockHelper.return_value.get_path.return_value = 'testing'
            worker = Worker()
            self.assertEqual(worker.work(), 'testing')
from unittest import TestCase, mock

from worker import Worker

class TestWorkerModule(TestCase):
    def test_patching_class(self):
        with mock.patch('helper.Helper') as MockHelper:
            MockHelper.return_value.get_path.return_value = 'testing'
            worker = Worker()
            self.assertEqual(worker.work(), 'testing')
helper.py:

import os

class Helper:
    def __init__(self, path):
        self.path = path

    def get_folder(self):
        base_path = os.getcwd()
        return os.path.join(base_path, self.path)

    def get_path(self):
        return self.path
您在这里所做的是将Helper类导入到worker模块中, 因此,当您尝试在test_worker.py上执行此操作时:

from helper import Helper

class Worker:
    def __init__(self):
        self.helper = Helper('db')

    def work(self):
        path = self.helper.get_path()
        print('Working on {path}')
        return path
from unittest import TestCase, mock

from worker import Worker

class TestWorkerModule(TestCase):
    def test_patching_class(self):
        with mock.patch('helper.Helper') as MockHelper:
            MockHelper.return_value.get_path.return_value = 'testing'
            worker = Worker()
            self.assertEqual(worker.work(), 'testing')
from unittest import TestCase, mock

from worker import Worker

class TestWorkerModule(TestCase):
    def test_patching_class(self):
        with mock.patch('helper.Helper') as MockHelper:
            MockHelper.return_value.get_path.return_value = 'testing'
            worker = Worker()
            self.assertEqual(worker.work(), 'testing')
结果:

AssertionError: 'db' != 'testing'
- db
+ testing
Ran 1 test in 0.002s

OK
Ran 1 test in 0.001s

OK
您正在Helper.py模块中修补Helper类, 但是您已经将Helper类导入到worker模块中,因此需要在worker模块中修补Helper类,例如:

from unittest import TestCase, mock

from worker import Worker

class TestWorkerModule(TestCase):
    def test_patching_class(self):
        with mock.patch('worker.Helper') as MockHelper:
            MockHelper.return_value.get_path.return_value = 'testing'
            worker = Worker()
            self.assertEqual(worker.work(), 'testing')
结果:

AssertionError: 'db' != 'testing'
- db
+ testing
Ran 1 test in 0.002s

OK
Ran 1 test in 0.001s

OK
使其适用于一般用例的另一种方法是,假设您希望在所有使用它的模块中修补Helper类,则将worker.py更改为:

import helper

class Worker:
    def __init__(self):
        self.helper = helper.Helper('db')

    def work(self):
        path = self.helper.get_path()
        print('Working on {path}')
        return path
在这里,您正在导入helper模块,并使用helper模块下的helper类, 现在您的test.py应该是这样的:

结果:

AssertionError: 'db' != 'testing'
- db
+ testing
Ran 1 test in 0.002s

OK
Ran 1 test in 0.001s

OK

这是有效的,因为我们没有将Helper类导入worker模块,而是导入了Helper模块,因此修补Helper.Helper现在可以正常工作。

假设我们有两个文件,worker.py和Helper.py

worker.py:

from helper import Helper

class Worker:
    def __init__(self):
        self.helper = Helper('db')

    def work(self):
        path = self.helper.get_path()
        print('Working on {path}')
        return path
from unittest import TestCase, mock

from worker import Worker

class TestWorkerModule(TestCase):
    def test_patching_class(self):
        with mock.patch('helper.Helper') as MockHelper:
            MockHelper.return_value.get_path.return_value = 'testing'
            worker = Worker()
            self.assertEqual(worker.work(), 'testing')
from unittest import TestCase, mock

from worker import Worker

class TestWorkerModule(TestCase):
    def test_patching_class(self):
        with mock.patch('helper.Helper') as MockHelper:
            MockHelper.return_value.get_path.return_value = 'testing'
            worker = Worker()
            self.assertEqual(worker.work(), 'testing')
helper.py:

import os

class Helper:
    def __init__(self, path):
        self.path = path

    def get_folder(self):
        base_path = os.getcwd()
        return os.path.join(base_path, self.path)

    def get_path(self):
        return self.path
您在这里所做的是将Helper类导入到worker模块中, 因此,当您尝试在test_worker.py上执行此操作时:

from helper import Helper

class Worker:
    def __init__(self):
        self.helper = Helper('db')

    def work(self):
        path = self.helper.get_path()
        print('Working on {path}')
        return path
from unittest import TestCase, mock

from worker import Worker

class TestWorkerModule(TestCase):
    def test_patching_class(self):
        with mock.patch('helper.Helper') as MockHelper:
            MockHelper.return_value.get_path.return_value = 'testing'
            worker = Worker()
            self.assertEqual(worker.work(), 'testing')
from unittest import TestCase, mock

from worker import Worker

class TestWorkerModule(TestCase):
    def test_patching_class(self):
        with mock.patch('helper.Helper') as MockHelper:
            MockHelper.return_value.get_path.return_value = 'testing'
            worker = Worker()
            self.assertEqual(worker.work(), 'testing')
结果:

AssertionError: 'db' != 'testing'
- db
+ testing
Ran 1 test in 0.002s

OK
Ran 1 test in 0.001s

OK
您正在Helper.py模块中修补Helper类, 但是您已经将Helper类导入到worker模块中,因此需要在worker模块中修补Helper类,例如:

from unittest import TestCase, mock

from worker import Worker

class TestWorkerModule(TestCase):
    def test_patching_class(self):
        with mock.patch('worker.Helper') as MockHelper:
            MockHelper.return_value.get_path.return_value = 'testing'
            worker = Worker()
            self.assertEqual(worker.work(), 'testing')
结果:

AssertionError: 'db' != 'testing'
- db
+ testing
Ran 1 test in 0.002s

OK
Ran 1 test in 0.001s

OK
使其适用于一般用例的另一种方法是,假设您希望在所有使用它的模块中修补Helper类,则将worker.py更改为:

import helper

class Worker:
    def __init__(self):
        self.helper = helper.Helper('db')

    def work(self):
        path = self.helper.get_path()
        print('Working on {path}')
        return path
在这里,您正在导入helper模块,并使用helper模块下的helper类, 现在您的test.py应该是这样的:

结果:

AssertionError: 'db' != 'testing'
- db
+ testing
Ran 1 test in 0.002s

OK
Ran 1 test in 0.001s

OK
这是因为我们没有将Helper类导入worker模块,而是导入了Helper模块,因此修补Helper.Helper现在确实可以正常工作。

请将您的问题标题转换为真正有意义的内容。您的问题应该具有足够的描述性,以便将来的网站用户在扫描搜索结果列表以寻找问题的解决方案时可以使用。您当前的标题没有提供任何有意义的信息。这显然是一个问题,否则就不在这里了,这显然与嘲弄有关,因为你添加了那个标签,剩下的单词没有提供任何有用的东西。谢谢。请把你的问题标题变成真正有意义的东西。您的问题应该具有足够的描述性,以便将来的网站用户在扫描搜索结果列表以寻找问题的解决方案时可以使用。您当前的标题没有提供任何有意义的信息。这显然是一个问题,否则就不在这里了,这显然与嘲弄有关,因为你添加了那个标签,剩下的单词没有提供任何有用的东西。谢谢