"内部函数"是指从定义的同一模块中调用的函数.
我在单元测试中使用模拟库,特别是补丁装饰器.它们是Django单元测试,但这适用于任何python测试.
我有一个具有多个功能的模块,其中许多功能相互调用.例如(虚构代码,忽略decimal.Decimal的缺失):
TAX_LOCATION = 'StateName, United States'
def add_tax(price, user):
tax = 0
if TAX_LOCATION == 'StateName, UnitedStates':
tax = price * .75
return (tax, price+tax)
def build_cart(...):
# build a cart object for `user`
tax, price = add_tax(cart.total, cart.user)
return cart
Run Code Online (Sandbox Code Playgroud)
这些是更深层调用链的一部分(func1 - > func2 - > build_cart - > add_tax),所有这些都在同一个模块中.
在我的单元测试中,我想禁用税收以获得一致的结果.在我看来,我的两个选项是1)修补TAX_LOCATION(用空字符串,比如说),这样add_tax实际上什么都不做,或者2)修补add_tax只返回(0,价格).
但是,当我尝试修补其中任何一个时,补丁似乎在外部工作(我可以在测试中导入修补部分并将其打印出来,获得预期值),但似乎内部没有效果(我得到的结果)代码表现得好像没有应用补丁).
我的测试是这样的(再次,虚构的代码):
from mock import patch
from django.test import TestCase
class MyTests(TestCase):
@patch('mymodule.TAX_LOCATION', '')
def test_tax_location(self):
import mymodule
print mymodule.TAX_LOCATION # '' …
Run Code Online (Sandbox Code Playgroud) 情景:我已经"继承"的程序,保持水银下,只有作品在我的系统上的具体调整,以某些文件被签入我不希望在检查这些调整.
我最近的解决方案是创建一个包含这些调整的mercurial补丁文件(hg diff> patchfile); 当我需要检查我的更改时,我将反向应用补丁,提交并重新应用补丁.(如果我完全控制了源代码,我只是将所有这些小调整移到一个不受版本控制的配置文件中,在版本控制下放置一个"示例"配置文件)
不幸的是,似乎虽然GNU patch
命令支持该--reverse
标志,但它不支持hg的多文件diff格式作为单个补丁文件(或者它可能,但我只是不知道它的开关?).OTOH,hg有自己的patch
命令可以应用diff,但是它不支持任何类型的reverse
标志.
所以我的问题是双重的:
我有一个普通的python(非Django)项目,我试图将Raven绑定到日志设置中.
在我们当前的设置下,我们使用简单的日志配置:
import logging
logging.basicConfig(format='long detailed format',
level=logging.DEBUG)
Run Code Online (Sandbox Code Playgroud)
然后将输出重定向到日志文件; 这会生成一个很好的,详细的日志,我们可以在需要时查看.
我们现在想要添加Raven的错误日志记录,将其绑定到我们当前的日志记录设置中,这样logging.error
调用也会导致消息被发送到Sentry服务器.使用以下代码:
from raven import Client
from raven.conf import setup_logging
from raven.handlers.logging import SentryHandler
raven = Client(environ.get('SENTRYURL', ''), site='SITE')
setup_logging(SentryHandler(raven, level=logging.ERROR))
Run Code Online (Sandbox Code Playgroud)
错误正在成功发送到Sentry,但我现在只获得一行文件输出:
DEBUG: Configuring Raven for host: <DSN url>
Run Code Online (Sandbox Code Playgroud)
所有其他文件输出 - 从- logging.debug
到logging.error
- 被抑制.
如果我评论该setup_logging
行,我得到文件输出但没有Sentry错误.我究竟做错了什么?
在我开始之前:这是一个100%的客户端问题.忘记服务器端语言,我如何处理上传等等 - 我正在比较一个已知的工作HTTP文件上传请求和jQuery生成的AJAX请求,理论上应该做同样的事情.
背景:我正在为tinyMCE编写一个文件上传插件.部分内容涉及允许支持它的浏览器上传拖放图像 - 具体来说,当文件系统映像被放入tinyMCE编辑器时,firefox中的tinyMCE会创建一个带有base64 src的img.这是我目前的用例,可能会在以后扩展.
我的目标是获取base64数据并使用jQuery模拟表单提交以将其上载到服务器.我已经有了一个正常的基于HTML表单的方法.
获取base64数据是蛋糕:
$('img[src^="data:"]', ed.getDoc()).each(function(){
var data = /data:(image\/\w+);base64,(.*)/gmi.exec(this.src), format, ext;
if (data){
format = data[1];
ext = format.split('/')[1];
data = atob(data[2]);
}
else{
// blah, not supported
}
});
Run Code Online (Sandbox Code Playgroud)
同样容易地准备POST数据:
var boundary = '--------------------boundary' + (new Date).getTime();
data = '\r\n' + boundary + '\r\n' +
'Content-Disposition: form-data; name="file-upload"; filename="uploaded_image.' + ext + '"\r\n' +
'Content-Type: ' + format + '\r\n\r\n' +
data + '\r\n' +
boundary + '--'
;
Run Code Online (Sandbox Code Playgroud)
剩下的就是把它发送到服务器:
$.ajax({
type: 'POST', …
Run Code Online (Sandbox Code Playgroud)