我有一个python Presenter类,它有一个创建不同Presenter类的实例的方法:
class MainPresenter(object):
def showPartNumberSelectionDialog(self, pn):
view = self.view.getPartNumberSelectionDialog(pn)
dialog = SecondPresenter(self.model, view)
dialog.show()
我的意图是为我的应用程序中的每个窗口编写一个单独的Presenter类,以便保持有序。不幸的是,我发现很难测试showPartNuberSelectionDialog
方法,特别是测试dialog.show()
被调用,因为实例是在方法调用中创建的。因此,即使我使用python的模拟框架修补SecondPresenter
,它仍然无法捕获对本地dialog
实例的调用。
所以,我有两个问题:
答案 0 :(得分:0)
是否可以修补SecondPresenter
并检查您如何调用它以及代码是否也调用show()
。
通过使用mock
框架和patch
,您应该用SecondPresenter
对象替换Mock
类实例。注意dialog
实例将是用于替换原始类实例的模拟的返回值。此外你应该照顾where to patch,现在我可以猜测该怎么做但它离最终测试版本不远:
@patch("mainpresentermodule.SecondPresenter", autospec=True)
def test_part_number_selection_dialog(self, mock_second_presenter_class):
main = MainPresenter()
main.showPartNumberSelectionDialog(123456)
dialog = mock_second_presenter_class.return_value
dialog.show.assert_called_with()
我使用autospec=True
只是因为我认为这是一种最佳做法,请查看Autospeccing了解更多详情。
你也可以修补main.view
和main.model
来测试你的代码如何调用dialog
的构造函数......但你应该使用mock而不是滥用它,你会嘲笑更多的东西和补丁以及更多你的测试将纠结于代码。
对于第二个问题,我认为这也是一个很好的做法测试这种块,但尝试尽可能地修补和模拟,以及你在测试环境中不能使用的东西:你将有一个更灵活的测试和你可以通过重写较少的测试代码来重构你的代码。