为什么 py.test 在 Pyunit 和 nosetest 失败时通过单元测试(如预期的那样)?

Why does py.test pass a unittest when Pyunit and nosetest fail it (as expected)?

在编写 python 单元测试方面,我是一个全新的初学者,我知道在编写代码之前编写测试要好得多,也更容易,但我想我应该先为一个github 项目并修复了一些小问题并试一试。

我正在解决的一个问题是,如果没有为方法提供参数,它实际上会删除服务器上的参数。我应该提到这个项目是 REST API 的客户端。这很容易修复,但我认为为它编写一个测试会很好。

损坏方法的代码包含在 class:

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 运行 进行此测试 - 如我所料,它失败了。如果我 运行 使用 nose 的测试它也失败了,再次完美。如果我 运行 在命令行上使用 py.test 进行测试,它会通过。

如果我使用 pytest.set_trace() 作为 mocked_requests_post 中的第一行,我可以打印 args 并且它表明昵称实际上不是 None 并且仍然设置服务器上的内容(即 device.nickname 所以断言通过)

我想不通为什么 py.test 没有从 self._session.post 中获取 json 中的零钱。如果我更改 URL 格式的 IDEN,它确实会接受该更改,但不会更改数据主体。

我做错了什么吗?我不明白为什么 py.test 会通过而 nose 会在相同的代码上失败。

编辑:在命令行我 运行ning py.test path/to/single_test_file.py 并且测试文件只有我在上面粘贴的单一测试方法。

终于解决了,我一定是在决定编写测试之前将客户端包安装到 python 中。看起来命令行 py.test 是从真正的源代码(通过 pip 安装)读取客户端包,而 IDE 是从我在 eclipse 中的开发包读取它。

解决方法是删除包:pip uninstall <package> 重新安装开发包:pip install -e .(在根开发目录下)