如何忽略或覆盖对类的所有方法的调用以进行测试

时间:2016-09-25 11:02:58

标签: python unit-testing

我已经设置了一个类似于它的单元测试:

@Entity
@Table(name = "BOOK")
public class Book {

@ManyToOne
@JoinColumn(name = "AUTHOR_ID")
private Author author;

// other fields, getters and setters

}

@Entity
@Table(name = "AUTHOR")
public class Author {

@Column(name = "LASTNAME")
private String lastname;

@OneToMany(cascade = CascadeType.ALL, mappedBy = "author")
List<Book> books = new ArrayList<Book>();

// other fields, getters and setters
}

我想测试的函数叫做get_dealer_position。在这个函数中,我更新了我的gui上没有初始化测试的一些项目,所以我得到了预期的错误:from unittest import TestCase from . import main from PIL import Image class TestTableScreenBased(TestCase): def test_get_game_number_on_screen2(self): t = main.TableScreenBased() t.entireScreenPIL = Image.open('tests/1773793_PreFlop_0.png') t.get_dealer_position()

NameError: name 'ui_action_and_signals' is not defined

忽略&#39;最好的方法是什么?或覆盖对该类def get_dealer_position(self): func_dict = self.coo[inspect.stack()[0][3]][self.tbl] ui_action_and_signals.signal_progressbar_increase.emit(5) ui_action_and_signals.signal_status.emit("Analyse dealer position") pil_image = self.crop_image(self.entireScreenPIL, self.tlc[0] + 0, self.tlc[1] + 0, self.tlc[0] +800, self.tlc[1] + 500) 中方法的所有调用?这个类包含很多方法(对于数百个gui项),我宁愿不必单独覆盖它们。有没有办法告诉python测试应该忽略与ui_action_and_signals相关的所有内容?猴子修补或嘲笑是否有任何优雅的方法可以使用应用程序?

1 个答案:

答案 0 :(得分:2)

如果您使用的是Python&gt; = 3.3,则可以使用内置的unittest.mock模块。如果您使用的是早期版本的Python,则可以使用Pip安装the backport来使用相同的工具。

你需要用Mock对象替换你缺少的依赖项 - 有很多方法可以做到,但是一种方法是使用补丁装饰器,它负责在测试后删除Mock对象:

from unittest.mock import patch
from unittest import TestCase
from . import main
from PIL import Image
class TestTableScreenBased(TestCase):
    @patch('module.path.of.ui_action_and_signals')
    def test_get_game_number_on_screen2(self, mock_ui_action_and_signals):
        t = main.TableScreenBased()
        t.entireScreenPIL = Image.open('tests/1773793_PreFlop_0.png')
        t.get_dealer_position()

有关补丁装饰器in the official documentation的更多信息,包括一些hints on where to patch,有时并不完全明显。

模拟系统还有许多其他您可能想要使用的功能,例如复制现有类的规范,或者找出在测试期间对Mock对象进行的调用。