我在编写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 - 它会失败,正如我所料。如果我使用鼻子进行测试,它也会失败,再次完美。如果我在命令行上使用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
,测试文件只有我上面粘贴的单一测试方法。
答案 0 :(得分:0)
最后解决了,我必须已经将客户端软件包安装到python之前决定编写测试。看起来命令行ifort test_corr.f90 -o test_corr
因此从真正的源(通过pip install)读取客户端包,而IDE正在从我在eclipse中的开发包中读取它。
解决方法是删除包:py.test
重新安装开发包:pip uninstall <package>
(在根开发目录中时)