小编Mik*_*e C的帖子

具有AttributeError和ValueError的Python PropertyMock副作用

我试图模拟一个类的属性(@property装饰器)并且碰到了这个不正确的行为:

 >>> from mock import MagicMock, PropertyMock
 >>> m = MagicMock()
 >>> type(m).p = PropertyMock(side_effect=AttributeError)
 >>> m.p
 <MagicMock name='mock.p' id='63150736'>
Run Code Online (Sandbox Code Playgroud)

正确的行为是这样的:

 >>> from mock import MagicMock, PropertyMock
 >>> m = MagicMock()
 >>> type(m).p = PropertyMock(side_effect=ValueError)
 >>> m.p
Traceback (most recent call last)
[...]
ValueError
Run Code Online (Sandbox Code Playgroud)

我无法理解为什么设置一个不同的例外会给我不同的结果.两种情况下的预期结果都是应该提出异常!因此,In [4]行应该提高一个AttributeError.它不是.

有人关心开导我吗?

附录:我试图检查的属性做了一些巧妙的检查,看看传递的值是否合理.如果所述值不合理,则返回AttributeError,因为我理解这是Python中的正确异常.所以,我需要检查使用该属性的代码是否失败以及成功.因此,使用MagicMock来模拟属性并引发异常.一个简单的例子是:

@x.setter
def x(self, value):
    if value < 0:
         raise AttributeError("Value cannot be negative!")
    self._x = value
Run Code Online (Sandbox Code Playgroud)

python mocking

13
推荐指数
1
解决办法
2479
查看次数

如何在$(document).ready()中始终获得包含图像的DIV的高度(仅限Webkit中的问题)

我有这个片段来演示这个问题:

<html>
<head>
  <title>height query demo</title>
  <script type="text/javascript" src="http://code.jquery.com/jquery-1.6.1.min.js"></script>
</head>
<body>
  <div id="opts" style="font-size:24px; text-align: center; margin: 10px auto;">
    <div>
      <img src="http://static.jquery.com/files/rocker/images/logo_jquery_215x53.gif"
           alt="jquerylogo"/>
    </div>
  </div>
  <h1>Demo of querying height</h1>
  <p>The source code of this document has a DIV prior to the H1.  The DIV contains a
  subdiv which in turn contains an image.<br />
  Using jQuery's <tt>$(document).ready</tt>, the following processing takes place:</p>
<ol><li>DIV queried for its height</li>
  <li>DIV detached from the document</li>
  <li>height value written out here: 
    <span style="font-size: larger; …
Run Code Online (Sandbox Code Playgroud)

jquery webkit

8
推荐指数
1
解决办法
7490
查看次数

如何显示对AJAX/getJSON请求的错误(text/html)响应?

我的情况是,我正在开发一个小型Web应用程序,其中服务器提供动态JSON响应.服务器建立在cherrypy上.有时,创建JSON数据的代码中存在一个错误,该错误会抛出,并且会抓住它并使用完整的HTML页面回收500错误,详细说明该异常.(也就是说,响应包含所有内容:) <!doctype..><html><head>...</head><body>...</body></html>但由于请求是AJAX,因此不会显示.

我可以很容易地拦截这个错误,并在开发工具中查看它; 但是我想做的事情(为了简化调试)是打开一个新页面(好像用户已经按照链接)并在浏览器中显示该响应.我试过了

window.open('', '_self');
$(document).html(jqXHR.responseText);
Run Code Online (Sandbox Code Playgroud)

但我得到一个空白页面.我想我可以存储错误文本并在第二次请求服务器中提供它,但有更清洁的方法吗?


为了跟进,最终的代码是:

.error(function(jqXHR, textStatus, errorThrown) {
    $(window).bind('unload', function() { document.write(jqXHR.responseText); } );
    var win = window.open('', '_self');
    return false;
});
Run Code Online (Sandbox Code Playgroud)

不确定最后return false是否有必要,但似乎是好的形式.


再次跟进:上面的代码在Opera中可靠地运行.我以为我也看到它在Webkit中工作,但我开始注意到它不是; 并且在进一步测试时,它也不适用于Firefox.

我发现在所有三个平台上工作的是:

document.open('text/html', true);
document.write(jqXHR.responseText);
document.close();
Run Code Online (Sandbox Code Playgroud)

不必打开另一个窗口或绑定事件; 只需重新打开文档并将文本填入其中.


好吧,我又来了.上述技术要么停止工作,要么当我说它曾经工作时我绊倒了.特别是Chrome似乎没有document.open定义.

但!我刚刚发现了一种似乎无处不在的漂亮技术:

errtext = 'data:text/html;base64,' + window.btoa(jqXHR.responseText);
window.open(errtext, '_self');
Run Code Online (Sandbox Code Playgroud)

这只是将响应转换为完全自包含的data:URL并在窗口中打开它.

javascript ajax error-handling

8
推荐指数
1
解决办法
4505
查看次数

C++ 11(或Boost)system_error策略

我其目的是使用名为类的系统上工作error_code,error_condition以及error_category-一个方案新标准:在C++ 11,本书虽然此刻我实际使用的加速实现.我已经阅读了Chris Kholkoff的一系列文章,现在已经三次了,我想我一般都懂得如何创建这些类.

我的问题是这个系统需要处理存在于各个DLL中的插件,插件可能会发出错误.我的原始设计是计划一个特定于系统的错误类别,该类别包含所有各种错误代码以及未真正映射到errno值的特定错误条件的列表.这里的问题是,为了使DLL能够使用这些错误代码之一,它需要访问error_category应用程序中的唯一实例.我现在通过SetErrorCategory()从每个DLL 导出一个函数来处理这个问题,这个函数有点工作但是有点icky.

我看到的替代解决方案是每个DLL都有自己的错误类别和代码,如果需要,还有自己的条件; 我怀疑这更像是为这个库功能所设想的.但是,我认为这需要主应用程序的错误方案中的比较函数,该错误方案知道插件的错误方案,并且可以检查应用程序的哪些条件与插件的错误相匹配.这似乎更容易出现一堆问题,尽管我还没有尝试过实现它.我猜我必须在所有实际逻辑之上从DLL导出整个错误方案.

当然,另一种方法是使用DLL中的数字错误代码并将它们填充到应用程序端的错误对象中.它具有插件简单的优点,但可能导致应用程序陷入困境(例如,从几个不同插件中处理对象的函数需要注意每个错误的来源).

所以我的具体问题是:你会使用哪三个选项,为什么?哪个显然不可行?当然,有没有一种更好的方式没有发生在我身上?

c++ boost c++11 system-error

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

std :: copy失败,“结束后无法寻找向量迭代器”

我把这个测试用例放在一起,用大代码重现了条件和问题。实际上,我确实需要从POD结构的C数组中进行复制,但是我希望将目标作为向量,以便它可以自行处理复制删除。

TEST_METHOD(std_copy)
{
    struct W { long a; int b; char c; char d; };
    W block[1] = { { 15, 42, 'D', 'X' } };
    std::vector<W> dest;
    dest.reserve(1);
    std::copy(block, block+1, dest.begin());
    Assert::AreEqual(42, dest[0].b);
}
Run Code Online (Sandbox Code Playgroud)

断言似乎是在dest.begin()调用内发生的,“在结束后不能寻求向量迭代器” ,这对我来说没有任何意义。我确定我只是缺少一个明显的细节,但这是什么?

c++ stdvector

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

如何限制可能抛出的导入

我有一个通常在Windows下运行并使用win32com模块的类.我也有这个类的模拟版本,无论是用于测试还是用于演示,都是从原始版本导入的,应该能够在任何地方运行.所以,就像这样,在两个文件中:

import win32com.client
class basic():
    def local_instance(self):
        # called once during setup of execution
        res = win32com.client.Dispatch('Foo.Bar')
    def res_attrib(self):
        # called repeatedly by threads; must re-instantiate COM obj
        return win32com.client.Dispatch('Foo.Bar').Attribute
    def otherstuf(self):
        ...

=======================
from basic import basic

class mock(basic):
    def local_instance(self):
        res = mock_foobar()    # mock implementation with .Attribute
    def res_attrib(self):
        return res.Attribute   # mock implementation, this is OK
    # otherwise uses otherstuf() unchanged
Run Code Online (Sandbox Code Playgroud)

这个问题是当模拟版本加载到没有win32com的环境中时,import win32com.client语句抛出.

我的问题是,限制该导入应用的正确方法是什么?

  • 将导入嵌入到每个方法中,重复执行:

    def local_instance(self):
        import win32com.client
        res = win32com.client.Dispatch('Foo.Bar')
    def res_attrib(self): …
    Run Code Online (Sandbox Code Playgroud)

python

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