我试图模拟一个类的属性(@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) 我有这个片段来演示这个问题:
<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) 我的情况是,我正在开发一个小型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并在窗口中打开它.
我其目的是使用名为类的系统上工作error_code,error_condition以及error_category-一个方案新标准:在C++ 11,本书虽然此刻我实际使用的加速实现.我已经阅读了Chris Kholkoff的一系列文章,现在已经三次了,我想我一般都懂得如何创建这些类.
我的问题是这个系统需要处理存在于各个DLL中的插件,插件可能会发出错误.我的原始设计是计划一个特定于系统的错误类别,该类别包含所有各种错误代码以及未真正映射到errno值的特定错误条件的列表.这里的问题是,为了使DLL能够使用这些错误代码之一,它需要访问error_category应用程序中的唯一实例.我现在通过SetErrorCategory()从每个DLL 导出一个函数来处理这个问题,这个函数有点工作但是有点icky.
我看到的替代解决方案是每个DLL都有自己的错误类别和代码,如果需要,还有自己的条件; 我怀疑这更像是为这个库功能所设想的.但是,我认为这需要主应用程序的错误方案中的比较函数,该错误方案知道插件的错误方案,并且可以检查应用程序的哪些条件与插件的错误相匹配.这似乎更容易出现一堆问题,尽管我还没有尝试过实现它.我猜我必须在所有实际逻辑之上从DLL导出整个错误方案.
当然,另一种方法是使用DLL中的数字错误代码并将它们填充到应用程序端的错误对象中.它具有插件简单的优点,但可能导致应用程序陷入困境(例如,从几个不同插件中处理对象的函数需要注意每个错误的来源).
所以我的具体问题是:你会使用哪三个选项,为什么?哪个显然不可行?当然,有没有一种更好的方式没有发生在我身上?
我把这个测试用例放在一起,用大代码重现了条件和问题。实际上,我确实需要从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()调用内发生的,“在结束后不能寻求向量迭代器” ,这对我来说没有任何意义。我确定我只是缺少一个明显的细节,但这是什么?
我有一个通常在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)