小编TJ1*_*J1S的帖子

使用mock更改函数调用的第二个结果

我有一个看起来像这样的循环:

for i in range(len(some_list)):
    response = requests.post(some_url, some_params)
    if response.status_code != HTTPOk:
       # do something
Run Code Online (Sandbox Code Playgroud)

我想做的是在循环的第二次迭代中更改requests.post的响应.从我的测试中,我知道我可以做以下事情:

mock_response = mock.Mock()
mock_response.status_code = 404
with mock.patch(mymodule.requests.post, return_value=mock_response):
   mymodule.some_function()
Run Code Online (Sandbox Code Playgroud)

但这似乎只适用于一个status_code.我看了side_effect,看起来我可以像这样遍历循环:

mock_response.side_effect = [
    mock.Mock(status_code=400), mock.Mock(status_code=200)
]
with mock.patch(mymodule.requests.post, return_value=mock_response):
   mymodule.some_function()
Run Code Online (Sandbox Code Playgroud)

但是,看起来它实际上并没有获得"正确"的状态代码.更改side_effect或return_value中的行为以正确获取我想要的行为的最佳方法是什么?我认为side_effect就是我想要的,但我不确定最好的方法是嘲笑回应.

python mocking pytest python-mock

7
推荐指数
1
解决办法
1431
查看次数

在开发模式下从应用创建Facebook广告创意

我想从我有以下要求(几乎从Python SDK文档拍摄的测试应用程序创建一个广告在Facebook的创意在这里):

Message: Call was not successful
Method:  POST
Path:     https://graph.facebook.com/v2.4/act_somenumber/adcreatives
Params:  {'object_story_spec': '{"link_data":{"caption":"www.example.com","image_hash":"existing_hash","link":"http://example.com","message":"try it out"},"page_id":"some_page_id"}', 'name': 'AdCreative for Link Ad'}
Run Code Online (Sandbox Code Playgroud)

但是,我收到以下回复:

Status:  500
Response:
{
  "error": {
    "code": 100,
    "is_transient": false,
    "error_subcode": 1885183,
    "error_user_msg": "Ads creative post was created by an app that is in development mode. It must be in public to create this ad.",
    "error_user_title": "Ads creative post was created by an app that is in development mode",
    "message": "Invalid parameter",
    "type": "FacebookApiException"
  }
} …
Run Code Online (Sandbox Code Playgroud)

facebook facebook-graph-api facebook-marketing-api

6
推荐指数
1
解决办法
1944
查看次数

正确的方法来迁移NDB模型属性

我目前在NDB中有一个模型,我想更改属性名称而不必触及NBD.假设我有以下内容:

from google.appengine.ext import ndb

class User(ndb.Model):
  company = ndb.KeyProperty(repeated=True)
Run Code Online (Sandbox Code Playgroud)

我想要的是更像这样的东西:

class User(ndb.Model):
  company_   = ndb.KeyProperty(repeated=True)

@property
def company(self):
   return '42'

@company.setter
def company(self, new_company):
    #set company here
Run Code Online (Sandbox Code Playgroud)

这样做有相对无痛的方法吗?我希望使用属性getter/setter,但考虑到当前的实现,我想避免触及底层数据存储.

python google-app-engine app-engine-ndb google-cloud-datastore

3
推荐指数
1
解决办法
408
查看次数