我已经设置了一个类似于它的单元测试:
@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相关的所有内容?猴子修补或嘲笑是否有任何优雅的方法可以使用应用程序?
答案 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对象进行的调用。