我有一个装饰器@auth
,它基本上检查数据库以确保用户可以访问给定的 REST 调用。我想为这些调用编写一些单元测试。我最初的想法是简单地将装饰器修补成一个什么都不做的通道。(我最初的想法失败了,所以我可能只是在里面修补一些函数,@auth
以便它总是通过,但我仍然很好奇是否可以完全绕过装饰器)
我拼凑了一个我希望完成的快速样本。
例子.py
# example.py
from __future__ import print_function
def sample_decorator(func):
def decorated(*args, **kwargs):
print("Start Calculation")
ans = func(*args, **kwargs) + 3
print(ans)
print("Finished")
return ans
return decorated
@sample_decorator
def add(a, b):
return a + b
Run Code Online (Sandbox Code Playgroud)
测试示例.py
# test_example.py
from __future__ import print_function
import pytest
import example
def test_add_with_decorator():
assert example.add(1, 1) == 5
def testadd_with_monkeypatch_out_decorator(monkeypatch):
monkeypatch.setattr(example, 'sample_decorator', lambda func: func)
assert example.add(1, 1) == 2 # this fails, but is the behaviour I …
Run Code Online (Sandbox Code Playgroud) 假设我有以下代码:
window.foo = function() {
bar();
function bar() {
console.log('hello');
}
}
/* insert monkey-patching code here */
foo();
Run Code Online (Sandbox Code Playgroud)
我可以用什么代码替换/* insert monkey-patching code here */
以使其例如写入goodbye
而不是hello
在控制台上?
我尝试了以下方法来覆盖bar
,但它不起作用:
window.foo = function() {
bar();
function bar() {
console.log('hello');
}
}
window.bar = function() {
console.log('goodbye');
}
window.foo.bar = function() {
console.log('goodbye');
}
foo();
Run Code Online (Sandbox Code Playgroud) 在 Python 中,您可以像这样在运行时将新的实例变量添加到类的实例中...
>> class Foo:
>> def __init__(self, bar):
>> self.bar = bar
>>
>> f = Foo()
>> setattr(f, "baz", "spam")
>> f.baz
"spam"
Run Code Online (Sandbox Code Playgroud)
...但它只对 instance 有影响,f
对 class 没有影响foo
。
>> x = Foo()
>> x.baz
AttributeError: 'Foo' object has no attribute 'baz'
Run Code Online (Sandbox Code Playgroud)
有没有办法将新的实例变量添加baz
到类中Foo
,以便该类的所有新实例都具有新变量?
我想在Rails应用程序中重新定义方法时打印类和方法,即使它发生在包含的gem中.我知道有一个叫做的钩子method_added
在重新定义一个方法时会被回调,但是我不知道怎么用它来捕获重新定义的东西.
我该怎么用method_added
?
我把它添加到boot.rb:
class Module
def method_added(name)
puts "adding #{self.name.underscore.capitalize} #{name}\n"
end
end
Run Code Online (Sandbox Code Playgroud)
但这似乎是每个班级中的每一种方法都在捕捉?