我试图弄清楚为什么我的Python客户端和Ruby服务器对如何加密数据存在分歧.我在Ruby代码和我的代码中看到的唯一区别是它们没有指定初始化向量,因此它回退到所有\ x0的默认值
当我尝试在没有iv的情况下实例化PyCrypto时它会给我一个错误.这是一个例子:
from Crypto.Cipher import AES
test = "Very, very confidential data"
key = b'Thirty Two Byte key, made Beef y'
gryp = AES.new(key, AES.MODE_CBC)
Run Code Online (Sandbox Code Playgroud)
(这个例子基本上是来自PyCrypto文档的示例代码而没有指定IV)文档说w/r/t IV"它是可选的,当它不存在时,它将被赋予全零的默认值." 但是我得到错误"ValueError:IV必须是16个字节长".
所以我可以指定IV,这不是问题,但我想弄清楚,如果它认为它不能使用默认值,如果我使用库的方式有其他错误.
我想确保我单独测试模型/对象而不是一个庞大的系统.
如果我有一个Order对象并且它有客户,Payments,OrderItems等的外键,并且我想测试Order功能,我需要为所有相关数据创建fixture,或者在代码中创建它.我认为我真正需要做的是嘲笑其他项目,但如果我对这些外键进行查询,我看不到一个简单(或可能)的解决方案.
常见的解决方案(灯具)并不能让我一次测试一个对象.我相信这部分是由我的应用程序所引起的方式在耦合.
我正在努力采用TDD作为我的主要工作方法,但是使用Django的方式,似乎你可以运行非常简单的单元测试,或者这些大规模的集成测试.
[编辑]更明确的例子,更谦虚
我的意思是我似乎只能进行琐碎的单元测试.我见过人们拥有非常好的测试和粒度模块.我确信其中一些可以追溯到糟糕的设计.
例:
我有一个模型调用Upsell,它链接到Product模型.然后我有一个选择模型,它是Upsell的孩子(你想要的是#1,#2,#3门后面的东西).
Upsell模型有几种方法可以导出从其选择中呈现模板所需的项目.最重要的一点是它为每个选择创建一个URL.它是通过一些字符串修改等来完成的.如果我想测试Upsell.get_urls()方法,我想让它不依赖于夹具中的选择值,我希望它不依赖于它的值固定装置中的产品.
现在我在setUp方法中填充db以进行测试,这与Django每次都支持事务的方式很有效,但只能在setUp和tearDown之外.除了一些模型设置起来相当复杂之外,这种方法效果相当不错,而实际上我只需要为它获取一个属性.
我不能给你一个例子,因为我无法完成它,但这是我现在正在做的事情.基本上我输入一个完整的订单,创建它附加的A/B实验,等等.这不包括所有由夹具设置的产品,类别等.这不是我所关心的额外工作,因为我甚至无法一次测试一个基于数据库的对象.下面的测试很重要,但它们是集成测试.我想通过分别测试每个项目来构建这样的东西.正如您所指出的,也许我不应该选择一个与数据库紧密相关的框架.是否存在任何类型的依赖注入?(超出我的测试范围,但代码本身也是如此)
class TestMultiSinglePaySwap(TestCase):
fixtures = ['/srv/asm/fixtures/alchemysites.json','/srv/asm/fixtures/catalog.json','/srv/asm/fixtures/checkout_smallset.json','/srv/asm/fixtures/order-test-fixture.json','/srv/asm/fixtures/offers.json']
def setUp(self):
self.o = Order()
self.sp = SiteProfile.objects.get(pk=1)
self.c = Customer.objects.get(pk=1)
signals.post_save.disconnect(order_email_first, sender=Order)
self.o.customer = self.c
p = Payment()
p.cc_number = '4444000011110000'
p.cc_exp_month = '12'
p.cc_type = 'V'
p.cc_exp_year = '2020'
p.cvv2 = '123'
p.save()
self.o.payment = p
self.o.site_profile = self.sp
self.o.save()
self.initial_items = []
self.main_kit = Product.objects.get(pk='MOA1000D6')
self.initial_items.append(self.main_kit)
self.o.add_item('MOA1000D6', 1, False)
self.item1 = Product.objects.get(pk='MOA1041A-6')
self.initial_items.append(self.item1)
self.o.add_item('MOA1041A-6', 1, False) …Run Code Online (Sandbox Code Playgroud) pickle函数是Python的功能之一,它允许您存储任何任意内容,并将其完全恢复为原始形式。一种常见用法是获取一个完全实例化的对象并将其腌制以备后用。就我而言,我有一个不可序列化的AMQP消息对象,我希望能够将其存储在会话存储中并检索它(可以用pickle进行处理)。主要区别在于,我需要在对象上调用方法,而不仅仅是查找数据。
但是该项目位于nodejs中,并且似乎所有节点的低级库都必须有某种方法来保存该对象,以便它可以在Web调用之间持久存在。
用例是一个网页接收RabbitMQ消息并显示从中获得的信息。在执行该消息之前,我不想确认该消息。我通常只是将数据保存为会话状态,但这不是一个选择,除非我能以某种方式将其保存为原始形式。
我正在使用遗留数据库,它以db方式执行一些有意义的事情,但不确定如何在Django中表示它们以便South和Django本身可以处理它们.
我有一个PartCode作为键的Parts表我有一个Vendor表,VendorCode作为键
我有一个零件和供应商的FK的PartsVendor表,以及关于这种关系的其他信息.我正在使用"通过"参数,因此它独立,但它使用PartCode + VendorCode作为复合键,Django不支持.只有在使用南方或像dumpdata这样的功能时,才能看到主键才会遇到问题.但是,这些都是相当大的问题.
我的临时解决方案是只添加一个_id字段作为AutoField并在Postgres中添加一个串行字段,它可以正常工作,但是当使用South时,它会阻塞default = False和NOT NULL的事实.
我已经走上了尝试编写自定义字段的道路,但这似乎是一个死胡同,因为我实际上并没有改变关于字段类型的任何内容.
django ×2
python ×2
aes ×1
amqp ×1
django-south ×1
flash ×1
mocking ×1
node.js ×1
postgresql ×1
pycrypto ×1
unit-testing ×1