2017-11-10 4 views
2

テストを期待通りに実行できない場合があります。私は2つのプロパティと1つのテストのメソッドの戻り値を模倣しようとしていますが、代わりに、私はMagicMockオブジェクトを取得したい戻り値を取得します。私の模造されたプロパティは指定された値を返さないが、MagicMockオブジェクトと私の模擬メソッドは期待値を返すのはなぜですか?

私はこれを行う方法を理解できません。私を最も苛立たせるのは、この方法を嘲笑することは期待どおりに機能するが、そうではない2つのプロパティに対して機能することである。 プロパティを使用しているため、または外部キーの関係のためにこれが問題になっているのですか、何か基本的に間違っていますか?私はここではDjango 1.8、Python2.7、モデルママ、ユニットテスト、モック

を使用しています

は私のコードのいくつか抜粋している、私は彼らが状況を理解するのに十分であることを望む:

App1のは、生産者と呼ばれます

# In producers.models.Producer: 

    @property 
    def is_valid(self): 
     # do stuff 
     return True 

App2のは

# In customers.models.Customer: 

    @property 
    def is_valid(self): 
     # do stuff 
     return True 

    def is_allowed_to_purchase_from_producer(producer): 
     # do stuff 
     return True 

App3起動CAの顧客と呼ばれますlled購入

# In purchases.models 

class Purchase(BaseModel): 

    producer = ForeignKey('Producers.Producer', related_name="purchase") 
    customer = ForeignKey('Customers.Customer', related_name="purchase") 


    def clean(self): 
     if not self.producer.is_valid: 
      rasie ValidationError 
     if not self.customer.is_valid: 
      raise ValidationError 
     if not self.customer.is_allowed_to_purchase_from_producer(self.producer): 
      raise ValidationError 

を購入モデル

# test_models.py, in PurchaseTestSuite 

    @mock.patch('producers.models.Producer.is_valid') 
    @mock.patch('customers.models.Customer.is_valid') 
    @mock.patch('customers.models.Customer.is_allowed_to_purchase_from_producer') 
    def test__clean(self, mock__customer_is_allowed_to_purchase, mock__customer_is_valid, mock__producer_is_valid): 

     mock__producer_is_valid.return_value = True 
     mock__customer_is_valid.return_value = False 
     mock__customer_is_allowed_to_purchase.return_value = False 

     valid_purchase.clean() 
    producer.is_validため
  • 実際に返される値のクリーンな方法のための試験:<MagicMock name='is_valid' id='4465040784'>
  • customer.is_validため
  • 実際戻り値:<MagicMock name='is_valid' id='4465109520'>
  • for customer.is_allowed_to_purchase_from_producer(プロデューサ):False

プロパティが呼び出されたかどうかをアサートすると、私はFalseになりますが、メソッドに対してはTrueになります。差異はどこにありますか?私は何を見ていないのですか?

+1

これはプロパティです。[PropertyMock](https://docs.python.org/3/library/unittest.mock.html#unittest.mock.PropertyMock)を使用してください。 –

+0

@DanielRosemanリンクをありがとう。私はドキュメンテーションをチェックしましたが、何とかPropertyMockにつまずくことはありませんでした。私はこれを文書化するための答えを出して、それを働かせるようになった。 – jimfawkes

答えて

0

ダニエル・ローズマンのコメントとPropertyMockへのリンクのおかげで、私はテストの実行方法を理解することができました。

クラスのプロパティ、または他の記述子として使用することを目的としたモック。 PropertyMockは、を取得します。()と()メソッドに設定します。 は、取得時に戻り値を指定できます。

したがって、上記の例のために、簡単な解決策は、すべてのプロパティに対して次のようにPropertyMockを使用することです:

@mock.patch('producers.models.Producer.is_valid', new_callable=mock.PropertyMock) 

残りは上記の例のように同じまま。

誰かが似たような問題を抱えている場合に役立ちます。

関連する問題