具有多个断言的Presenter-First Unittest

时间:2015-11-25 19:13:23

标签: python unit-testing presenter-first

我正在尝试将Presenter-First方法用于新项目。我发现自己下面是unittest。我是否通过在此测试中包含如此多的断言来利用不良的单元测试实践?如果是,我的测试方法或presenter.setOverview的实现问题是什么?换句话说,setOverview方法应该调用self.setSalesQty而不是self.view.setSalesQty吗?在这种情况下,我将对presenter.setSalesQty进行单独测试,testSetOverview测试将不再需要担心测试它。

def testSetOverview(self):
    # set up mock objects
    p = PropertyMock()
    type(self.mock_model).descriptions = p
    self.mock_model.getData.side_effect = [5, 10]
    self.mock_model.getDescription.side_effect = 'Description'

    # get required variables
    end = dt.date.today()
    start = dt.date(year=end.year, month=1, day=1)
    pn = 'abcd'

    # call presenter method
    self.presenter.setOverview(pn)

    # test to make sure proper calls were made
    model_getData_calls = [call(pn=pn, start=start, end=end,
                       data=self.mock_model.SHIPPED_QUANTITY),
                   call(pn=pn, start=start, end=end,
                        data=self.mock_model.PRICE_PAID)]

    self.mock_model.getData.assert_has_calls(model_getData_calls, any_order=True)
    assert self.mock_model.getDescription.called

    self.mock_view.setSalesQty.assert_called_with(val=5)
    self.mock_view.setSalesDols.assert_called_with(val=10)
    self.mock_view.setDescription.assert_called_with(val='Description')

1 个答案:

答案 0 :(得分:1)

因此,通常在编写单元测试时,您希望测试一个特定的东西。因为当您编写更多代码并且测试失败时,您将更容易理解单元测试中的内容失败。可能是因为到目前为止您所做的断言正在测试代码的一个行为或功能,那么断言就可以了。

举个例子,list_counter以下有两个函数取决于word_count。因此,在测试list_counter时,您可以进行两次断言以确保list_counter中的两个组件是正确的。但是分别测试word_count可能更明智。

def word_count(word):
    return len(word)

def list_counter(listing=None):
    total = 0
    for l in listing:
        total += word_count(l)

    return (len(listing), total)

由于我无法访问模型的外观,因此很难对您的案例进行更具体的评论。 self.mock_view也无处不在。