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

时间:2016-01-16 21:56:19

标签: python unit-testing pytest

我在编写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_getmocked_requests_post被调用。如果我使用pyUnit在eclipse PyDev中运行此测试来运行pytest - 它会失败,正如我所料。如果我使用鼻子进行测试,它也会失败,再次完美。如果我在命令行上使用py.test运行测试,它会通过。

如果我使用pytest.set_trace()作为mocked_requests_post中的第一行,我可以打印args并显示昵称实际上不是“无”并且仍然设置为昵称server(即device.nickname,因此断言通过)

我不能为我的生活解决为什么py.test没有从self._session.post中获取json中的变化。如果我更改了URL格式的iden,它确实会获取该更改,但是更改它不会更改数据正文。

我做了一些内在错误的事情吗?我无法理解为什么py.test会通过,而鼻子会因同一代码而失败。

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

1 个答案:

答案 0 :(得分:0)

最后解决了,我必须已经将客户端软件包安装到python之前决定编写测试。看起来命令行ifort test_corr.f90 -o test_corr 因此从真正的源(通过pip install)读取客户端包,而IDE正在从我在eclipse中的开发包中读取它。

解决方法是删除包:py.test 重新安装开发包:pip uninstall <package>(在根开发目录中时)