在編寫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_get
和mocked_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
和測試文件只有我上面粘貼的單個測試方法。
你有隔離了這個特定的測試(只有法)分隔的文件? – kwarunek
當我編寫修復程序時,它是文件中唯一的測試。只有其他代碼是我沒有粘貼的模擬代碼,它返回我的假響應。 – kikixx