Python 演示者第一个具有多个断言的单元测试

Python 演示者第一个具有多个断言的单元测试,python,unit-testing,presenter-first,Python,Unit Testing,Presenter First,我正试图利用演示者优先的方法来完成一个新项目。我发现自己与下面的单元测试。我是否利用了糟糕的单元测试实践,在这个测试中包含了这么多断言?如果是,我的测试方法或presenter.setOverview的实现是否存在问题?换句话说,setOverview方法是否应该调用self.setSalesQty而不是self.view.setSalesQty?在本例中,我将对presenter.setSalesQty进行单独的测试,testSetOverview测试将不再需要担心测试这个问题 def tes

我正试图利用演示者优先的方法来完成一个新项目。我发现自己与下面的单元测试。我是否利用了糟糕的单元测试实践,在这个测试中包含了这么多断言?如果是,我的测试方法或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\u counter
取决于
word\u count
。因此,在测试
list\u counter
时,您可以做出两个断言,以确保
list\u counter
中的两个组件是正确的。但单独测试
字数可能更明智

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_视图
也不知从何而来

没有提供更多关于self.mock_视图和self.mock_模型的信息是故意的-这些都是模拟对象,因此(据我所知)不应该进行测试。演示者本身正在接受测试,它依赖于这两个对象,并利用它们来完成工作。是的,它们不应该被测试,但看到它们所代表的对象可能会帮助您提供有关如何编写测试的建议。这很公平。不过,为了与“presenter first”保持一致,我采取的方法是,首先编写presenter单元测试和实现。在我为模型或视图写任何东西之前。我在mock中作为占位符进行子划分,在编写presenter测试和实现之后,我使用mock方法调用作为模型和视图单元测试和实现的起点。这是非典型的吗?