2015-01-06 107 views
3

調用nosetests給了我下面的:Nosetest初始化錯誤

====================================================================== 
ERROR: Failure: TypeError (__init__() takes exactly 2 arguments (1 given)) 
---------------------------------------------------------------------- 
Traceback (most recent call last): 
    File "/home/sheena/WORK/CriticalID/workspace/flow_env2/local/lib/python2.7/site-packages/nose-1.3.4-py2.7.egg/nose/loader.py", line 519, in makeTest 
    return self._makeTest(obj, parent) 
    File "/home/sheena/WORK/CriticalID/workspace/flow_env2/local/lib/python2.7/site-packages/nose-1.3.4-py2.7.egg/nose/loader.py", line 578, in _makeTest 
    return MethodTestCase(obj) 
    File "/home/sheena/WORK/CriticalID/workspace/flow_env2/local/lib/python2.7/site-packages/nose-1.3.4-py2.7.egg/nose/case.py", line 345, in __init__ 
    self.inst = self.cls() 
TypeError: __init__() takes exactly 2 arguments (1 given) 

以及一些其他的東西。

我的目錄結構如下:

MyStuff 
    ./__init__.py 
    ./tests 
     ./some_tests.py 
     ./other_tests.py 
     ./ ... lots more 
     ./a_useful_group_of_tests 
      ./more_tests.py 
      ./tasty_tests.py 
      ./ ...lots more 
    ./other_files_and_directories 

現在有一個很大的文件進行大量的實驗和這個錯誤沒有給我的地方在我的代碼來自的錯誤指示。有關我如何找到它的任何想法?到目前爲止我所能想到的最好的辦法是擺脫所有的測試文件,然後逐個放回去,但這並不完全理想。

+1

你的測試用例是否有非默認的構造函數?即'__init __(self,some_param)' –

+0

您可以通過在'nosetests'命令之後指定文件名來運行單個測試。我也認爲你可以在每個子目錄下運行'nosetests',因爲它只會遞歸那個子目錄。這應該有助於限制您正在測試的文件。 – Evert

+0

你有沒有試過增加鼻子的冗長度:'-vv'和變體。也許鼻子會告訴你足夠的然後推斷壞檔案。 – Evert

回答

1

解決辦法:

從腳本的頂部刪除import語句。

爲什麼:

定位測試文件給我的問題後,我執行nosetests-vv選項按埃弗特的建議。事實證明,錯誤消息不是來自任何特定的測試。也就是說,測試按預期運行,這些錯誤只是標記在輸出上。輸出如下所示:

Failure: TypeError (__init__() takes exactly 2 arguments (1 given)) ... ERROR 
Failure: TypeError (__init__() takes exactly 2 arguments (1 given)) ... ERROR 
... 
test_clear_instructions (the_calculator2.tests.model_tests.workflow_tests.Workflow_tests) ... 
...all my tests follow 

測試用例中沒有唯一的東西是導入語句。所以我把他們移到了他們使用的地方。

但爲什麼會發生這種情況?獎勵積分的人誰再知道

,我不覺得自己通過代碼裏姆斯閱讀找到答案


示例代碼:

from my.stuff import goodies #<----------Error from this line 

class My_tests(unittest.TestCase): 
    def test_one(self): 
     do stuff 
    def test_two(self): 
     do other stuff 

在此代碼沒有錯誤:

class My_tests(unittest.TestCase): 
    def test_one(self): 
     from my.stuff import goodies 
     do stuff 
    def test_two(self): 
     from my.stuff import goodies 
     do other stuff 
+0

由於您提出了一個新問題,您可以更好地使用此解決方案更新您當前的問題,*和*新問題(但不要覆蓋舊問題,只需添加到它),*或*提出一個全新的問題。否則,你會得到答案,而不是回答問題。 – Evert

+0

你應該展示一個最小的測試,儘管問題發生在人們能夠回答的地方。 – Evert

+0

@Evert:我原來的q是如何解決我面臨的問題。問題解決了,這個問題就回答了。如果有人比我有更好的答案(一個不只是解決問題,而是說實際正在發生的事情),我會很樂意將它標記爲正確的,可能是最後一票,因爲這個東西很奇怪。我在這裏要求的是我自己正確答案的更有用的版本。 – Sheena

3

通常的原因是你正在使用一個類e那些沒有進口或者已經破壞進口的測試。或者有其他單獨的測試或導入類,當通過全局鼻子測試用例運行環境與其他測試初始化​​時,例如由於在另一個測試中導入缺少的導入而導致該類錯誤。 但是在初始加載測試類或單個加載時 - 會引發未找到或其他錯誤。但鼻子並沒有那麼清楚,儘管它可能會顯示課程的初始化錯誤。

因此,在測試環境中使用示例代碼'好東西'中的某些東西在模塊初始化時沒有被傳遞參數,這是它被正確初始化所需的參數。但是如果在測試中稍後進行初始化,就可以得到它。

或者,你有一個方法在一個類中不小心被稱爲test_something,它不是一個測試類(例如某個地方的好東西或它所使用的類),並且鼻子發現它並且沒有所需的參數進行初始化。

你可以嘗試通過導入一個接一個地將它們放回模塊級別 - 然後初始化python shell中的問題類來修復它。

0

所以我花了太多時間在這個問題上,想要回報。

如果您使用--with-xunit運行測試,您會注意到在路徑nose.failure.Failure.runTest下測試了故障。如果您嘗試運行該測試,則會說它不存在。這裏有一些奇怪的事情發生。

有趣的是,如果你在--collect-only --verbose下運行它,你會得到Failure: TypeError (__init__() takes exactly 2 arguments (1 given)) ... ok,所以當它可能不應該被識別爲測試時,它會立即被識別爲測試。實際上,與失敗測試相鄰的兩個包都通過了,所以即使找出哪個文件失敗也不是直截了當的。

事實證明,有一個非測試文件被創建,其名稱中包含test。鼻子試圖把它解釋爲測試,因此也是錯誤。

很遺憾,我不得不手動運行每個軟件包來弄清楚。你可以這樣做的一種方法是find /path/to/package -name "*test*.py,然後grep找不到測試目錄中的任何東西。