具有多个断言的 Presenter-First 单元测试

Presenter-First Unittest with Multiple Assertions

我正在尝试将 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')

所以通常在编写单元测试时,您希望测试一件特定的事情。因为当您编写更多代码并且测试失败时,您会更容易理解单元测试失败的原因。可能是因为您目前所做的断言是在测试代码的一种行为或功能,然后断言就可以了。

举个例子,你下面有两个函数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 也突然出现了。