在编写 python 单元测试方面,我是一个全新的初学者,我知道在代码之前编写测试要好得多也容易得多,但我想我会从为 github 项目做出贡献并修复一些小问题开始,试一试。
我正在解决的一个问题是,如果没有为方法提供参数,它实际上会删除服务器上的参数。我应该提到这个项目是一个 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
被调用。如果我使用 pyUnit 在 Eclipse PyDev 中运行此测试来运行 pytest - 它会失败,正如我所料。如果我使用 Nose 运行测试它也会失败,再次完美。如果我在命令行上使用 py.test 运行测试,它会通过。如果我使用
pytest.set_trace()
作为 mocked_requests_post
中的第一行我可以打印args
它表明昵称实际上不是 None 并且仍然设置为它在服务器上的内容(即 device.nickname 所以断言通过)我一生都无法弄清楚为什么 py.test 没有从
self._session.post
中获取 json 中的更改.如果我更改 URL 格式中的 ide,它确实会接受该更改,但不会更改数据主体。我做错了什么吗?我不明白为什么 py.test 会通过而 Nose 会在相同的代码上失败。
编辑:在命令行上我正在运行
py.test path/to/single_test_file.py
并且测试文件只有我在上面粘贴的单一测试方法。
最佳答案
终于解决了,我必须在决定编写测试之前将客户端包安装到 python 中。看起来像命令行 py.test
因此,从真正的源(通过 pip install)读取客户端包,而 IDE 从我在 eclipse 中的开发包中读取它。
解决方法是删除包:pip uninstall <package>
重新安装开发包:pip install -e .
(在根开发目录中时)
关于python - 当 Pyunit 和 Nose 测试失败时,为什么 py.test 通过单元测试(如预期的那样)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34832582/