2016-01-16 39 views
1

在編寫python unittests時,我是一個完整的新手,我知道在代碼之前編寫測試要容易得多,但是我認爲我應該從貢獻一個github項目開始,然後修復幾個小問題問題,並給它一個去。爲什麼py.test在Pyunit和nosetest失敗時通過單元測試(如預期)?

我正在修復的一個問題是,如果沒有給方法一個參數,它實際上會刪除服務器上的參數。我應該提到這個項目是一個REST API的客戶端。這很容易解決,但我認爲爲它編寫測試會很好。

破碎方法的代碼被包括在類中:

def edit_device(self, device, nickname=None, model=None, manufacturer=None): 
    data = {"nickname": nickname} 
    iden = device.device_iden 
    r = self._session.post("{}/{}".format(self.DEVICES_URL, iden), data=json.dumps(data)) 

我然後將使用Mock使用他們的文檔爲先導嘲笑REST API的響應(其包括例如響應) 。

我遇到的問題是我寫我的測試爲:

@mock.patch('pushbullet.pushbullet.requests.Session.get', side_effect=mocked_requests_get) 
@mock.patch('pushbullet.pushbullet.requests.Session.post', side_effect=mocked_requests_post) 
class TestPushbullet(object): 

    def test_edit_device_without_nickname(self, mock_get, mock_post): 
     pb = pushbullet.Pushbullet("API_KEY") 
     device = pb.devices[0] 
     new_device = pb.edit_device(device) 
     assert new_device.nickname == device.nickname 

這似乎正常工作,方法mocked_requests_getmocked_requests_post被調用。如果我在eclipse PyDev中使用pyUnit運行這個測試來運行pytest - 它會失敗,正如我所期望的那樣。如果我用鼻子進行測試,它也會失敗,再次完美。如果我在命令行上使用py.test運行測試,它會通過。

如果我使用pytest.set_trace()mocked_requests_post第一線,我可以打印args它表明了綽號其實不是沒有,仍然設置爲它在服務器上的內容(即device.nickname這樣的斷言通過)

我不能爲我的生活找出爲什麼py.test不會從self._session.post中獲取json中的變化。如果我以URL格式更改標識符,它確實會發現這種變化,但是更改它不包含的數據主體。

我在做一些本質上錯誤的事情嗎?我不明白爲什麼py.test會通過,鼻子會在相同的代碼上失敗。

編輯:在命令行我運行py.test path/to/single_test_file.py和測試文件只有我上面粘貼的單個測試方法。

+0

你有隔離了這個特定的測試(只有法)分隔的文件? – kwarunek

+0

當我編寫修復程序時,它是文件中唯一的測試。只有其他代碼是我沒有粘貼的模擬代碼,它返回我的假響應。 – kikixx

回答

1

終於搞定了,我必須在python之前安裝客戶端軟件包才能決定編寫測試。看起來命令行py.test因此正在從真正的源代碼(通過pip安裝)讀取客戶端軟件包,而IDE正在從eclipse中的開發包中讀取它。

解決方法是刪除軟件包:pip uninstall <package> 重新安裝開發包:pip install -e .(當根開發目錄)

相關問題