2012-04-03 25 views
0

doctestとシェルで同じコードを使用すると、異なる出力が生成されます。
私はいくつかのテストを実行するa()という関数を持っています。
同じテストがdoctest(test())で使用されています。
test()がエラーを表示し、最初のOBJECTのみを表示している間、a()でOBJECT-BLANKLINE-OBJECTを取得します。
これはdoctestモジュールの欠陥ですか?ここでシェルの出力と異なるDoctestの出力

は、トップの両方の()とテスト()でファイル全体です:

''' 
>>> u1 = User("[email protected]", "simples") 
>>> u2 = User("[email protected]", "complicada") 
>>> u2.askFriend(u1) 
>>> u1.recvRequest(u2) 
>>> u1.confirmFriend(u2) 
>>> p1 = Post(u1, "O ultimo post", "http://www.wikipedia.org") 
>>> p2 = Post(u2, "A ultima resposta", "http://www.google.com") 
>>> c = Comments() 
>>> c.add(p1) 
>>> c.add(p2) 
>>> f1 = c.search(user="[email protected]") 
>>> print(f1) 
A ultima resposta 
http://www.google.com 
0 Gosto, 0 Nao gosto 
>>> f2 = c.search(likes=1) 
>>> print(f2) 
<BLANKLINE> 
>>> f3 = c.search(text='post') 
>>> print(f3) 
O ultimo post 
http://www.wikipedia.org 
0 Gosto, 0 Nao gosto 
<BLANKLINE> 
A ultima resposta 
http://www.google.com 
0 Gosto, 0 Nao gosto 
''' 

def test(): 
    import doctest 
    doctest.testmod() 

def a(): 
    u1 = User("[email protected]", "simples") 
    u2 = User("[email protected]", "complicada") 
    u2.askFriend(u1) 
    u1.recvRequest(u2) 
    u1.confirmFriend(u2) 
    p1 = Post(u1, "O ultimo post", "http://www.wikipedia.org") 
    p2 = Post(u2, "A ultima resposta", "http://www.google.com") 
    c = Comments() 
    c.add(p1) 
    c.add(p2) 
    f3 = c.search(text="post") 
    print(f3) 

import string 

class User: 

    def __init__(self,email,passwd): 
     self.email = email 
     self.passwd = passwd 
     self.name = None 
     self.year = None 
     self.active = True 
     self.recv = [] 
     self.conf = [] 
     self.setPassword(self.passwd) 

    def __str__(self): 
     if self.name == None and self.active == True: 
      return str(self.email) + ':' + 'ativa' 

     elif self.name != None and self.active == True: 
      return str(self.name) + ':' + str(self.email) + ':' + 'ativa' 

     elif self.name != None and self.active == False: 
      return str(self.name) + ':' + str(self.email) + ':' + 'inativa' 

     else: 
      return str(self.email) + ':' + 'inativa' 

    def getEmail(self): 
     return self.email 

    def setPassword(self,passwd): 
     abc = string.ascii_lowercase 
     cifra = abc[3:] + abc[:3] 
     dec = list(passwd) 
     passwdCif = "" 
     for i in dec: 
      cif = cifra[abc.find(i)] 
      passwdCif += cif 
     self.passwd = passwdCif 

    def getPassword(self): 
     return self.passwd 

    def setName(self,name): 
     self.name = name 

    def getName(self): 
     return self.name 

    def setBirth(self,year,month,day): 
     self.year = year 
     self.month = month 
     self.day = day 

    def getBirth(self): 
     if self.year == None: 
      return None 
     else: 
      return '(' + str(self.year) + ', ' + str(self.month) + ', ' + str(self.day) + ')' 

    def isActive(self): 
     if self.active == True: 
      return True 
     else: 
      return False 

    def setActive(self): 
     self.active = True 

    def setInactive(self): 
     self.active = False 

    def askFriend(self,u): 
     self.conf.append(u) 

    def recvRequest(self,u): 
     self.recv.append(u) 

    def confirmFriend(self,u): 
     if len(self.recv) == 0: 
      return None 
     else: 
      for i in self.recv: 
       if i == u: 
        self.recv.remove(i) 
        self.conf.append(i) 
       else: 
        return None 


    def isFriend(self,u): 
     if u in self.conf: 
      return True 
     elif self == u: 
      return True 
     else: 
      return False 

    def showPending(self): 
     if len(self.recv) == 0: 
      return None 
     else: 
      for i in self.recv: 
       print i 

    def showFriends(self): 
     if len(self.conf) == 0: 
      return None 
     else: 
      for i in self.conf: 
       print i 

class Post(): 
    def __init__(self,u,text='',link=None): 
     self.u = u 
     self.text = text 
     self.link = link 
     self.seg = None 
     self.ant = None 
     self.likeList = [] 
     self.dislikeList = [] 

    def __str__(self): 
     if self.link == None: 
      return str(self.text) + '\n' + str(len(self.likeList)) + ' Gosto, ' + str(len(self.dislikeList)) + ' Nao gosto' 
     else: 
      return str(self.text) + '\n' + str(self.link) + '\n' + str(len(self.likeList)) + ' Gosto, ' + str(len(self.dislikeList)) + ' Nao gosto' 

    def updateText(self,text): 
     self.text = text 

    def updateLink(self,link): 
     self.link = link 

    def like(self,u): 
     if (u in self.u.conf) or (u == self.u): 
      if u in self.dislikeList: 
       self.dislikeList.remove(u) 
       self.likeList.append(u) 
      elif u in self.likeList: 
       return None 
      else: 
       self.likeList.append(u) 
     else: 
      return None 

    def dislike(self,u): 
     if (u in self.u.conf) or (u == self.u): 
      if u in self.likeList: 
       self.likeList.remove(u) 
       self.dislikeList.append(u) 
      elif u in self.dislikeList: 
       return None 
      else: 
       self.dislikeList.append(u) 
     else: 
      return None 

class Comments(): 
    def __init__(self, u=None, text='', link=None): 
     self.u = u 
     self.text = text 
     self.link = link 
     self.topo = None 
     self.fim = None 

    def __str__(self): 
     actual = self.topo 
     s = '' 
     if actual == None: 
      return '' 
     while actual != None: 
      if actual.seg == None: 
       s += str(actual) 
       actual = actual.seg 
      elif actual.seg != None: 
       s += str(actual) + '\n' + '\n' 
       actual = actual.seg 
     return s 

    def add(self,comment): 
     if self.topo == None: 
      comment.ant = None 
      comment.seg = None 
      self.topo = comment 
      self.fim = comment 
     else: 
      comment.ant = None 
      comment.seg = self.topo 
      self.topo.ant = comment 
      self.topo = comment 

    def remove(self,comment): 
     actual = self.topo 
     if (self.topo == self.fim) and (self.topo == comment): 
      self.topo = None 
      self.fim = None 
      actual = None 
     while actual!=None: 
      if actual == comment: 
       if actual.ant == None: 
        self.topo = actual.seg 
        actual.seg.ant = None 
       elif actual.seg == None: 
        self.fim = actual.ant 
        actual.ant.seg = None 
       else: 
        actual.seg.ant = actual.ant 
        actual.ant.seg = actual.seg 
       break 
      else: 
       actual = actual.seg 

    def countLike(self): 
     count = 0 
     actual = self.topo 
     while actual != None: 
      if len(actual.likeList) >= 1: 
       count += 1 
       actual = actual.seg 
      else: 
       actual = actual.seg 
     return count 

    def showRecentComments(self,n): 
     count = 1 
     actual = self.topo 
     sC = '' 
     if actual == None: 
      return None 
     while actual != None: 
      if count < n: 
       if actual.seg == None: 
        sC += str(actual) 
        count += 1 
        actual = actual.seg 
       else: 
        sC += str(actual) + '\n' + '\n' 
        count += 1 
        actual = actual.seg 
      elif count == n: 
       sC += str(actual) 
       count += 1 
       actual = actual.seg 
      elif count > n: 
       break 
     print sC 

    def search(self, user=None, likes=None, dislikes=None, text=None): 
     result = [] 
     actual = self.topo 
     cR = Comments() 
     if actual == None: 
      return None 

     while actual != None: 
      if user != None: 
       if actual.u.email != user: 
        actual = actual.seg 
       elif actual.u.email == user: 
        result.append(actual) 
        actual = actual.seg 
      elif user == None: 
       break 
     actual = self.topo 

     while actual != None: 
      if likes != None: 
       if likes > len(actual.likeList): 
        actual = actual.seg 
       elif likes <= len(actual.likeList): 
        if actual in result: 
         actual = actual.seg 
        else: 
         result.append(actual) 
         actual = actual.seg 
      elif likes == None: 
       break 
     actual = self.topo 

     while actual != None: 
      if dislikes != None: 
       if dislikes > len(actual.dislikeList): 
        actual = actual.seg 
       elif dislikes <= len(actual.dislikeList): 
        if actual in result: 
         actual = actual.seg 
        else: 
         result.append(actual) 
         actual = actual.seg 
      elif dislikes == None: 
       break 
     actual = self.topo 

     while actual != None: 
      if text != None: 
       if text not in actual.text: 
        actual = actual.seg 
       elif text in actual.text: 
        if actual in result: 
         actual = actual.seg 
        else: 
         result.append(actual) 
         actual = actual.seg 
      elif text == None: 
       break 
     if len(result) != 0: 
      for i in result: 
       cR.add(i) 
     return cR 

そして、ここでは、私は両方()とテスト()を使用して取得した出力です:

>>> a() 
O ultimo post 
http://www.wikipedia.org 
0 Gosto, 0 Nao gosto 

A ultima resposta 
http://www.google.com 
0 Gosto, 0 Nao gosto 
>>> test() 
********************************************************************** 
File "__main__", line 22, in __main__ 
Failed example: 
    print(f3) 
Expected: 
    O ultimo post 
    http://www.wikipedia.org 
    0 Gosto, 0 Nao gosto 
    <BLANKLINE> 
    A ultima resposta 
    http://www.google.com 
    0 Gosto, 0 Nao gosto 
Got: 
    A ultima resposta 
    http://www.google.com 
    0 Gosto, 0 Nao gosto 
********************************************************************** 
1 items had failures: 
    1 of 16 in __main__ 
***Test Failed*** 1 failures. 
>>> 

私の以前のひどく尋ねられた質問についてもお詫び申し上げます。
うまくいけば、これは私と他の人を助けるでしょう。

+0

コードを同じような動作をしている最短バージョンに絞り込む必要があります。そうすれば、おそらくあなた自身が問題を見つけるでしょう。 – marue

+0

あなたは本当にこれを見てください:http://stackoverflow.com/questions/how-to-askあなたがそれを使用する状況について暗闇の中に私たちを残す多くのコードを提供していますが、テスト用のコード。 – marue

+0

質問が書き換えられました。 –

答えて

2

あなたのdoctestとあなたの関数の間に1つの明らかな違いがあります:あなたの関数aは、このんが:あなたのdoctestはこの行い

# previous code 
c.add(p2) 
f3 = c.search(text="post") 
print(f3) 

# previous code 
c.add(p2) 
f1 = c.search(user="[email protected]") 
print(f1) 
f2 = c.search(likes=1) 
print(f2) 
f3 = c.search(text='post') 
print(f3) 

を私はまさにそこに何が起こるか分かりませんおそらく、あなたは同じことをする関数を書くべきです。それでも結果が異なる場合は、doctestに問題があります。それ以外の場合はコードに問題があります。

編集:

今、私はあなたが困っている理由を理解し始め、それがdeeeeeeepトラブルです。

actual = self.topo 

私はPythonがプロパティを割り当てる方法を知らないと思います。以降のコードでは、あなたが実際に変更し、再度、実際にself.topoを割り当てる:

actual.seg = "somevalue" # sorry, i can't remember what you did" 
actual = self.topo 

実際はすでにself.topoであるように、第2行は、完全に無意味であることを!それはself.topoの価値ではありませんが、self.topoです。

代わりの

actual.seg = "somevalue" 

を書いて、あなただけの両方の線が正確に同じことを行う

self.topo.seg = "somevalue" 

を書くことができます。だから、あなたが何らかの独立した財産を変更していると思っている間に、あなたは本当にself.topoをいつも変更しました。つまり、actualは関数の各開始点で等しくないが、最後に実行したときの値は常にc.searchです。

他の関数でもこれをやっていることがわかりました。つまり、このような関数を呼び出すたびにCommentsインスタンスの状態を変更しています。もちろん、各テストごとに異なる出力が得られます。

これは、より分かりやすくするために、ここではリストと例です。

>>> a_list = ['one','two','three'] 
>>> b_list = a_list 
>>> b_list.pop() 
'three' 
>>> a_list 
['one', 'two'] 

見ての通り:Allthougは、私はそれは同様a_listからなくなって、b_listから要素をポップました。文b_list = a_listは、文字通り、b_listがa_listと同じであることを意味するためです。

これが役に立ちます。

+0

どのように私はそれのポストを失うことなくパラメータを "クリーン"できますか? 私は検索機能の中でいくつかのことを試みましたが、私は実際にはどうやっていません。 –

+0

申し訳ありません。私の答えを訂正した、説明は間違っていた。たぶん私は後でそれをもう一度見る時間があります。 – marue

+0

あなたが言ったように、説明は実際には間違っていました。 私はいくつかの追加テストを行いましたが、テキスト部分が正しく動作していません。 –

関連する問題