小编ete*_*ode的帖子

如何使用mock修补模块的内部函数?

"内部函数"是指从定义的同一模块中调用的函数.

我在单元测试中使用模拟库,特别是补丁装饰器.它们是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)

python patch mocking

23
推荐指数
2
解决办法
2万
查看次数

Mercurial可以做反向补丁吗?

情景:我已经"继承"的程序,保持水银下,只有作品在我的系统上的具体调整,以某些文件被签入我希望在检查这些调整.

我最近的解决方案是创建一个包含这些调整的mercurial补丁文件(hg diff> patchfile); 当我需要检查我的更改时,我将反向应用补丁,提交并重新应用补丁.(如果我完全控制了源代码,我只是将所有这些小调整移到一个不受版本控制的配置文件中,在版本控制下放置一个"示例"配置文件)

不幸的是,似乎虽然GNU patch命令支持该--reverse标志,但它不支持hg的多文件diff格式作为单个补丁文件(或者它可能,但我只是不知道它的开关?).OTOH,hg有自己的patch命令可以应用diff,但是它不支持任何类型的reverse标志.

所以我的问题是双重的:

  1. 应该如何在mercurial中完成?当然,坚持使用"调整补丁"并不是处理这种情况的唯一方法.也许mercurial有一个插件或内置的东西,用于这种暂时的,不可承认的变化.
  2. 除了应该如何完成任务之外,有没有什么方法可以将这样的mercurial diff-patch反向应用到像这样的mercurial repo?在其他情况下,此类功能将非常有用.

diff mercurial patch

10
推荐指数
1
解决办法
8548
查看次数

Raven的SentryHandler将StreamHandler输出抑制为文件

我有一个普通的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.debuglogging.error- 被抑制.

如果我评论该setup_logging行,我得到文件输出但没有Sentry错误.我究竟做错了什么?

python logging sentry raven

5
推荐指数
1
解决办法
900
查看次数

jQuery.ajax模拟POST文件上传,不发送UTF-8内容

在我开始之前:这是一个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)

javascript jquery post utf-8

0
推荐指数
1
解决办法
3873
查看次数

标签 统计

patch ×2

python ×2

diff ×1

javascript ×1

jquery ×1

logging ×1

mercurial ×1

mocking ×1

post ×1

raven ×1

sentry ×1

utf-8 ×1