2015-11-25 12 views
5

新しいプロジェクトにPresenter-Firstアプローチを利用しようとしています。私は以下のunittestで自分自身を見つける。私は、このテストで非常に多くのアサーションを含めることで、貧弱なユニットテストの慣行を利用していますか?はいの場合は、テストへの私のアプローチやpresenter.setOverviewの実装に問題がありますか?つまり、setOverviewメソッドはself.view.setSalesQtyではなくself.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

一般的に、単体テストを書くときは、特定のものをテストしたいと思っています。より多くのコードを書くとテストが失敗すると、ユニットテストで何が失敗したのかを理解するのがずっと簡単になるためです。これまでのアサーションでは、コードの1つの動作や機能をテストしており、アサーションは正常です。

たとえば、list_counterの2つの機能は、word_countに依存しています。したがって、list_counterをテストするときは、2つのアサーションを作成してlist_counterの2つのコンポーネントが正しいことを確認することができます。しかし、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はどこにも表示されません。

+0

self.mock_viewとself.mock_modelについての詳しい情報は意図的ではありません。これらは模擬オブジェクトであり、そのように(私の理解では)テスト中ではありません。プレゼンター自体はテスト中で、これらの2つのオブジェクトに依存し、それらを使用して作業を行います。 – wesanyer

+0

はい、テストするべきではありませんが、それらが表現しているオブジェクトを見ることで、テストの書き方についてのアドバイスが得られます。 – Jonathan

+0

十分です。しかし、私が取っていたアプローチは、「プレゼンターの最初のもの」に合わせて、プレゼンターのユニットテストと実装を先に書くことでした。モデルやビューのために何かを書く前に。私はプレースホルダーとしてモックに潜んでいました。プレゼンターのテストと実装を書いた後、モデルとビューユニットのテストと実装を開始する場所として模擬メソッド呼び出しを使用しました。これは非定型ですか? – wesanyer

関連する問題