- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一些代码,我正在测试一个包装异常,当它失败并且异常传播时,我认为错误消息和回溯不够详细,主要是因为它没有告诉我预期与. 测试,我想要异常和期望的详细信息。
我调整了我的测试(参见下面的示例代码)。我想知道这种方法是否有效,是否有任何 Python 测试或模拟框架允许直接实现它? (目前我正在使用 unittest 和 mox)
this question 的答案之一简要介绍了在这种情况下使用 self.fail 的适当性,但并未详细说明。我的假设是,如果我尝试将测试限制在一个区域,我可以通过测试。
注意:如果您运行该代码示例,它应该会失败,以演示我希望看到的行为。我正在使用 Python 2.7、Mox 0.5.3
import sys
import urllib2
from contextlib import closing
try:
import lxml.etree as ET
except ImportError:
import xml.etree.ElementTree as ET
class Defect(Exception):
"""Wrapped exception, for module error detection"""
def __init__(self, *args):
Exception.__init__(self, *args)
self.wrapped_exc = sys.exc_info()
class StudioResources:
"""Dummy class"""
def _opener(self, request, html=False):
with closing(urllib2.urlopen(request)) as response:
try:
if html:
import lxml.html
return lxml.html.parse(response)
else:
return ET.parse(response)
except urllib2.HTTPError, e:
if e.code in [400, 500]: # Bad Request, Internal Server Error
raise Defect, "report error to the library maintainer"
else:
raise
###
# Tests
###
import unittest
import mox
import traceback
import difflib
import urllib
import httplib
def format_expectation(exc_expected=None, exc_instance=None):
"""Synopsis - For exceptions, inspired by _AssertRaisesContext
try:
self.assertRaises(myexc, self.studio._opener, None)
except Exception, e:
self.fail(format_expectation(exc_expected=myexc, exc_instance=e))
"""
if not isinstance(exc_expected, type) or exc_instance is None:
raise ValueError, "check __init__ args"
differ = difflib.Differ()
inst_class = exc_instance.__class__
def fullname(c): return "%s.%s" % (c.__module__, c.__name__)
diff = differ.compare(
(fullname(inst_class),), (fullname(exc_expected),))
_str = ("Unexpected Exception type. unexpected:- expected:+\n%s"
% ("\n".join(diff),))
return _str
class StudioTest(mox.MoxTestBase):
def setUp(self):
mox.MoxTestBase.setUp(self)
self.studio = StudioResources()
def test_opener_defect(self):
f = urllib.addinfourl(urllib2.StringIO('dummy'), None, None)
RESP_CODE = 501
self.mox.StubOutWithMock(f, 'read')
self.mox.StubOutWithMock(urllib2, 'urlopen')
urllib2.urlopen(mox.IgnoreArg()).AndReturn(f)
f.read(mox.IgnoreArg()).AndRaise(urllib2.HTTPError(
'http://c.com', RESP_CODE, httplib.responses[RESP_CODE], "", None))
self.mox.ReplayAll()
try:
with self.assertRaises(Defect) as exc_info:
self.studio._opener(None)
except Exception, e:
traceback.print_exc()
self.fail(format_expectation(exc_expected=Defect, exc_instance=e))
# check the response code
exc, inst, tb = exc_info.exception.wrapped_exc
self.assertEquals(inst.code, RESP_CODE)
self.mox.VerifyAll()
if __name__ == '__main__':
unittest.main()
最佳答案
在编写单元测试时,将测试限制在一件事上总是一个好主意。我没有发现您的代码有任何问题,但我会将所有内容包装在上下文管理器中。我使用 nose 而不是 unittest,它将任何 AssertionError 视为失败(这意味着无需调用 self.fail()
),并且我编写了自己的上下文管理器来处理此问题案件。如果您有兴趣,这是代码:
class assert_raises:
def __init__(self, exception):
self.exception = exception
def __enter__(self):
return self
def __exit__(self, exc_type, exc_val, exc_tb):
assert exc_type is self.exception, "Got '{}', expected '{}'"\
.format('None' if exc_type is None else exc_type.__name__,
self.exception.__name__)
return True
然后在这些示例中使用它:
>>> with assert_raised(ValueError):
... raise ValueError
>>> with assert_raised(ValueError):
... pass
Traceback (most recent call last):
...
AssertionError: Got 'None', expected 'ValueError'
>>> with assert_raised(ValueError):
... raise TypeError
Traceback (most recent call last):
...
AssertionError: Got 'TypeError', expected 'ValueError'
由于引发了 AssertionError,nose 将其视为失败并打印完整的回溯。这是为 nose 设计的,但是为 unittest 和 mox 调整它是一件微不足道的事情。如果您不太关心失败的确切模式,您甚至可以按原样使用它。
关于python - 使用 assertRaises - 处理传播的异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8954008/
如果有人能解释这个注释的作用以及我们何时使用它: @Transactional(propagation=Propagation.REQUIRED) 谢谢 最佳答案 如果您需要在 Spring Docs
我有一个页面,它有一个 keydown 事件监听器,用于监听 Escape 键,以便返回。我还有一个简单的模态类,它也监听 Escape 键以关闭它。主页监听器检查模式是否打开,如果打开,则不执行任何
我想在模型中设置默认变量名称 T (=xx) - 将该模型拖到新模型中并在其中定义变量 xx。我收到错误消息:使用未声明的变量 xx。 这是子模型 model test parameter Rea
在 android 2.x 浏览器中查看此示例..它是在我的应用程序中复制场景的示例.. http://johnchacko.net/samples/tap.html 它是关于监听“tap”并从监听器
如您所见,我正在尝试将 GatewayConnectionFailedException 传播到我的 UI。我希望此代码捕获除异常之外的所有内容,我希望表示层捕获该异常以通知用户数据库是问题所在,以便
我目前正在尝试让可执行文件与它需要的所有依赖项正确链接。 这是依赖项的示例结构: exe -> libA -> libB exe和 libA有自己的存储库。 exe拉入libA像这样的东西: add_
有什么方法可以调用带有单个参数的 Scala 函数,给定一个数组 (类似于 JavaScript Spreads在 ECMAScript 6) 中? ys = [10.0, 2.72, -3.14]
我有一个小型静态库,它需要 boost 头文件,并且需要包含目录中的“include”目录。 ... add_library(alib STATIC ...) target_include_direc
我有一些 promise 可以返回对象。 现在我想将它们合并/扩展为一个新对象,因此我使用 Lodash's extend . var whenEverythingIsDone = Promise.a
这是我认为人们通常希望在 Scala 中做的事情,但如果我能在任何地方找到一个例子,我就该死了。 这段代码由于类型删除而无法编译,但它演示了我正在努力完成的事情: def parse[T](json:
这是我认为人们通常希望在 Scala 中做的事情,但如果我能在任何地方找到一个例子,我就该死了。 这段代码由于类型删除而无法编译,但它演示了我正在努力完成的事情: def parse[T](json:
我们有大量 MOSS 2007 站点需要添加大量的 javascript。我编辑、 checkin 、发布并批准了对 default.master 的更改,更改反射(reflect)在根网站上,但没有
请看一下下面的 fiddle :http://jsfiddle.net/K9NjY/ 我在这段代码上花了 3-4 个小时,并将其缩小到最短的版本,但现在我陷入了困境。 问题:1. 点击“divOne”
我读到如果在流程中抛出异常,框架要做的第一件事就是检查消息头中的错误 channel 属性。总是这样吗? 在我的特殊情况下,我将自定义错误 channel 分配给消息 header ,但该消息似乎已向
创建一个小的 C++ 大型精度类,一切似乎都运行良好,但是添加,如果我将 0xffffffff 和 0x04 加在一起,我会得到 0xffff0003,而我应该得到 0x0100000003。这是有问
我正在尝试重新创建 Dan Abramov 类(class)中的 Redux 示例。传播{...store.getState()}在应用程序级别不起作用,Redux 正在更改状态并且 React 不会
考虑一个需要很长时间的事务。在此期间,我想对 TableSmall 执行一些小更新。 ,它应该立即执行,并且主事务的回滚不应该回滚那些小的更新。 我当前的问题是这些小更新将锁定 TableSmall\
我需要对现有函数进行修改,具有一些 const 输入参数: int f(const owntype *r1, const owntype *r2) 为了做到这一点,我想调用一个使用相同类型但没有 co
我有一个带有 ViewModel 的 WPF UserControl: 这个 UserControl 有一个 De
我试图在收到这样的短信时不传播 public class SMSReceiver extends BroadcastReceiver { @Override public void onRec
我是一名优秀的程序员,十分优秀!