5

我正在尝试将 Presenter-First 方法用于一个新项目。我发现自己在下面的单元测试中。我是否通过在此测试中包含如此多的断言来利用糟糕的单元测试实践?如果是,是我的测试方法或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')
4

1 回答 1

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也突然出现。

于 2015-12-17T22:42:48.903 回答