テストを期待通りに実行できない場合があります。私は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になります。差異はどこにありますか?私は何を見ていないのですか?
これはプロパティです。[PropertyMock](https://docs.python.org/3/library/unittest.mock.html#unittest.mock.PropertyMock)を使用してください。 –
@DanielRosemanリンクをありがとう。私はドキュメンテーションをチェックしましたが、何とかPropertyMockにつまずくことはありませんでした。私はこれを文書化するための答えを出して、それを働かせるようになった。 – jimfawkes