我无法理解模拟补丁是如何工作的以及它是否能够解决我的问题。
我有3个文件:与外部接口的通信(a.py)、业务逻辑(b.py)和测试(test.py)。我想修补运行测试时业务逻辑使用的外部接口。
a.py:
class SomeProductionClassINeedPatch(object):
name = 'Production Class (communication with some external service)'
def do_something(self):
print '<some feature with external service>'
Run Code Online (Sandbox Code Playgroud)
b.py:
import mock
from src.tmp.mocks.a import SomeProductionClassINeedPatch
class WorkingClass(object):
def some_method_that_uses_external_class(self, *args):
external = self._external
external.do_something()
@property
def _external(self):
if not hasattr(self, '_ext_obj' or not self._ext_obj):
self._ext_obj = SomeProductionClassINeedPatch()
print isinstance(self._ext_obj, mock.MagicMock) # False
return self._ext_obj
b = WorkingClass()
b.some_method_that_uses_external_class()
Run Code Online (Sandbox Code Playgroud)
测试.py:
import mock
from src.tmp.mocks.b import WorkingClass # class I want to test
@mock.patch('src.tmp.mocks.a.SomeProductionClassINeedPatch')
def test_some_method_of_working_class(external_mock=None, *args):
o …Run Code Online (Sandbox Code Playgroud) 我创建了一个自定义图例,但他没有显示补丁的影线。怎么了?
import matplotlib.pyplot as plt
from matplotlib.patches import Patch
from pylab import *
t = arange(0.0, 2.0, 0.01)
s = sin(2*pi*t)
fig1 = plt.figure(1,(10,10))
plt.plot(t, s)
plt.xlabel('time (s)')
plt.ylabel('voltage (mV)')
plt.title('About as simple as it gets, folks')
plt.grid(True)
far_patch = Patch(color=[168/256,175/256,175/256], label='Farshore')
near_patch = Patch(color=[168/256,175/256,175/256], label='Nearshore', hatch ='o')
legend=plt.legend(handles=[far_patch, near_patch],loc='upper left', handlelength=1, handleheight=1,labelspacing=0, fontsize=8,borderaxespad=0.3,handletextpad=0.2)
frame = legend.get_frame()
frame.set_edgecolor('none')
figureName='test'
plt.savefig(figureName+'.pdf',bbox_inches='tight',dpi=fig1.dpi)
plt.show()
Run Code Online (Sandbox Code Playgroud)
谢谢
我最近开始在 python 中使用模拟框架。似乎如果我修补一个函数,则不会调用实际代码-这意味着未实现此实际函数所做的数据库更改等。我一直试图通过事先调用函数并存储返回值并将其作为 arg 传递到 patch() 来绕过它,但是有没有更好的方法来做到这一点?理想情况下,我想要一个可以用作 a 的代码,silent observer我可以简单地询问它是否observed调用了某个函数,调用了多少次,以及使用了哪些参数
return_val = funct()
# C: Now call me again and assert that these intensive computation functions are not called but taken from cache
with patch('funct', return_value=return_val) as mock_task:
me_response = self.client.get(me_url, format='json') #should fetch from cache
assert not mock_task.called
Run Code Online (Sandbox Code Playgroud) 我正在尝试修补一个文件。
补丁文件位于要打补丁的文件列表所在的目录中。
当我运行赞扬时
patch < file.patch
它提示我
File to patch:
如何避免这种情况?我应该在补丁文件中添加什么来自动检测它应该修补的文件名
大约五个月前,我们开始了一个项目,对遗留的 PHP-4/5 应用程序进行大修和升级,将其迁移到 PHP-7(以及许多其他内容)。此应用程序包含 2,700 多个文件,并且几乎对所有文件都进行了大量更改。
同时,遗留应用程序继续支持客户,到目前为止已经进行了大约 250 次更改。我有(并且可以制作……)git补丁来表示这些更改。我眼前的问题是他们中的大多数都没有git apply。
当然,很容易理解为什么:补丁中表示的“行号”几乎没有用。虽然在大多数情况下,被寻找的源代码是存在,它可能已被移动一段距离。
我现在的想法(根据有关补丁文件的30考试)是,在用地,很多情况下,文字的源代码将被打补丁是仍然存在,逐字,在源文件中,只是没有在预期的地方.
尽管我很现实,知道其中许多补丁必须手动分析和制作,但为了时间和准确性,我想尽量减少这种情况。我希望将要这样做的人......包括我(!)......能够尽可能地利用自动化工具,知道他们将不得不检查每个补丁的工作。我不幻想我可以一次自动完成所有这些文件,“Shazam。 ”
那么,有谁遇到过类似的情况呢?你建议我做什么?一个建议是使用patch带有fuzz选项的命令,请注意,该命令可能会起作用或可能导致应用不正确的补丁。
(我们计划在任何情况下一次做一个补丁:“补丁git commit、冲洗和重复。” 这样我们就git diff可以检查每个更改的完整性。)
“战争故事”要求。谢谢。
我正在尝试创建一个.sh在内部运行补丁的文件。因此,patch -p0与其在脚本旁边运行补丁文件,不如将补丁嵌入其中。
我尝试了以下
patch -p0 <<EOF
Index: app/code/Magento/CustomerImportExport/Model/Import/Customer.php
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- app/code/Magento/CustomerImportExport/Model/Import/Customer.php (date 1487543450000)
+++ app/code/Magento/CustomerImportExport/Model/Import/Customer.php (revision )
@@ -371,6 +371,7 @@
// attribute values
foreach (array_intersect_key($rowData, $this->_attributes) as $attributeCode => $value) {
if ($newCustomer && !strlen($value)) {
+ $entityRow[$attributeCode] = $value;
continue;
}
EOF
Run Code Online (Sandbox Code Playgroud)
但它不起作用。但是,当我patch -p0在原始补丁文件上运行时,它可以正常工作。任何线索可能是错误的?
谢谢,
我正在开发用于事件管理的 API。我有基本的 GET 和 POST 方法,但现在我必须处理事件资源版本。
用户可以使用以下方法编辑所有事件信息:
/event/:eventId但它也可以取消事件(不是删除它,而是改变它的status属性)。
我正在考虑使用这个端点:
/event/:eventId并发送一个只有新status属性值的正文。我认为这是一个很好的方法,但后来我注意到状态只能设置为CANCELLED,在某些情况下,事件的其他允许状态会在业务逻辑中自动更改。
因此status,如果您只能将其更改为一个可能的值,则发送该字段根本没有意义。
因此,不向 PATCH 方法发送任何主体是否可能并且不是一种坏习惯?谢谢。
git mergetool很棒(就我而言,我使用 kdiff3)。但是,无法使用它来解决来自git am或git apply(甚至与patch命令)的冲突。实际上,mergetool 在git am使用修改版本和补丁时需要 3 个文件才能工作(基本版本和两个修改版本)。
你知道一种git mergetool用于与产生的冲突的方法git am吗?
我认为有必要从修改版本和补丁中猜测基本文件。如果单独考虑每个块,看起来很棘手,但并非不可能。
我有一个函数
# foo.py
NUM_SHARDS = 10
def get_shard(shard_key: int) -> int
return (shard_key % NUM_SHARDS) + 1
Run Code Online (Sandbox Code Playgroud)
我想模拟这个函数,以便每当调用这个函数时,它都会返回某个值。我试过像这样打补丁
# test.py
@mock.patch('foo.get_shard', return_value=11)
def testSomething(self, patched_func):
patched_func() # >> 11 ... OK so this is fine but
get_shard(4) # >> 5 .... Original impl being executed
Run Code Online (Sandbox Code Playgroud)
我想深入修改这个函数以始终返回这个值,无论这个函数是否直接从单元测试调用。
作为上下文,我有许多生产分片 (10) 和一个测试分片 (11)。get_shard 函数被多次调用,该函数的生产版本仅支持 10 个分片。因此,我希望该函数在单元测试上下文中执行时始终返回 11(测试分片编号)。
我试图检测加载的模块是否在运行时被恶意进程修补。在这种情况下,模块是一个正在运行的 EXE。
我的检测方案如下:
MODULEINFO mInfo;
GetModuleInformation(myProc, myInstance, &modInfo, sizeof(MODULEINFO));
//
char* hash1 = hashBytes(mInfo.lpBaseOfDll, mInfo.SizeOfImage);
//.....some time later
char* hash2 = hashBytes(mInfo.lpBaseOfDll, mInfo.SizeOfImage);
//
bool moduleIsModified = compareHashes(hash1, hash2); //false == we're patched!
Run Code Online (Sandbox Code Playgroud)
起初这很好用......如果没有补丁出现,哈希将是相同的,我可以成功检测到我自己的补丁(模块地址空间中的字节随 VirtualProect/CopyMemory 改变)。
但是,我发现如果我在 hash1/hash2 的生成之间放入以下代码,哈希将不再匹配:
//char* hash1 = ....
std::ifstream stream(pathToModule); //this causes hashes to no longer match???
//char* hash1 = ....
Run Code Online (Sandbox Code Playgroud)
为什么向模块创建文件流会更改模块的预加载字节?我假设模块在加载后会静态地位于内存中(假设没有恶意补丁)显然是不正确的......但为什么呢?模块加载的字节是否有特定区域是动态的?