标签: monkeypatching

绕过装饰器进行单元测试

我有一个装饰器@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)

python monkeypatching pytest

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

如何猴子修补在另一个函数中声明的函数

假设我有以下代码:

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)

javascript monkeypatching

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

在 Python 中,我可以在运行时更改类的结构吗?

在 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,以便该类的所有新实例都具有新变量?

python monkeypatching

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

如何在任何时候记录任何方法已经在Rails猴子修补

我想在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)

但这似乎是每个班级中的每一种方法都在捕捉?

ruby monkeypatching ruby-on-rails

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