如何避免这种python依赖?

时间:2016-01-12 16:50:59

标签: python unit-testing dependencies

我有一个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实例的调用。

所以,我有两个问题:

  1. 如何更改我的方法以使此代码更易于测试?
  2. 测试这样的简单代码块是不错的做法?

1 个答案:

答案 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.viewmain.model来测试你的代码如何调用dialog的构造函数......但你应该使用mock而不是滥用它,你会嘲笑更多的东西和补丁以及更多你的测试将纠结于代码。

对于第二个问题,我认为这也是一个很好的做法测试这种块,但尝试尽可能地修补和模拟,以及你在测试环境中不能使用的东西:你将有一个更灵活的测试和你可以通过重写较少的测试代码来重构你的代码。