2016-07-18 19 views
0

Authenticatorと呼ばれるDjangoモデルのテストに取り組んでいますが、AuthenticatorモデルにはManyToManyFieldとOneToOneFieldというフィールドがあります。 モデルをテストすると、私はRelatedObjectDoesNotExistとValueErrorが得られます: "matt"を割り当てることができません: "Authenticator.authenticator"は "User"インスタンスでなければなりません。RelatedObjectDoesNotExist

auth = Authenticator(authenticator = "matt")

あなたが "authenticator" とAuthenticatorを初期化しようとすると:ここ

は私のモデルは、私のテストコードはラインで

from django.test import TestCase 
from .models import User, Authenticator 

class EntryModelTest(TestCase): 
    def test_string_representation_for_authenticator(self): 
     auth = Authenticator(authenticator = "matt") 
     print "Auth: ", auth 
     consistency_weight = Authenticator(weight = "0") 
     print "Consistency Weight: ", consistency_weight 
     self.assertEqual(str(auth), auth.authenticator) 
     self.assertEqual(int(consistency_weight), consistency_weight.weight) 
+0

エラーが発生した場合RelatedObjectDoesNotExistと言うと、関連するオブジェクトが存在しないことをイメージします。 –

+0

2つのエラーメッセージのデコードを支援したい場合は、エラーメッセージとその原因となったコードを正確に含める必要があります。一般的に、エラー処理コードを持たないテストケースは2つのエラーを発生させるべきではないので、少なくとも1つのエラーを引き起こした状況を省略したようです。 – marr75

答えて

1

ある

class Authenticator(models.Model): 
    orders     =  models.ManyToManyField('client.Order', related_name = 'order_set') 
    authenticator   =  models.OneToOneField(User, on_delete = models.CASCADE) 
    weight     =  models.IntegerField(default = 0) 
    percentage_accuracy  =  models.FloatField("Nearness to aggregate score", default=0) 
    date_assigned   =  models.DateTimeField(default = timezone.now) 
    job_count    =  models.IntegerField(default = 0) 
    percentage_consistency =  models.FloatField(default = 0) 


    def __unicode__(self): 
     return '%s' %(self.authenticator.username) 

ですプロパティ値"matt"。この属性はユーザーモデルである必要があると宣言しているので、ここにUserインスタンスを割り当てる必要があります。ような何か:

auth = Authenticator(authenticator=User(name="matt"))

あなたは(私は明らかに、ユーザーモデルの構造を知らない)やろうとしているものに近いかもしれません。その向こう

、迷惑コーディングのアドバイスのいくつかの作品:

  • 使用PEP8
  • Authenticatorの属性として名前authenticatorが混乱しています。それがあるので、userはここに多くの意味をなさない可能性があるユーザーのこのオーセンティケータの属性
  • 避けprint文とあなたの__unicode__方法で別のモデルへのアクセスあなたの個々のテスト
  • で複数のアサーションをテストするには二つの問題を紹介する - それが原因となりますN + 1シナリオを生成する可能性のあるデータベースルックアップで、このモデルの文字列表現が使用できなくなり、デバッグ/ロギングが複雑になり、デバッグ/ロギングが複雑になります。