簡體   English   中英

帶有 unittest.mock 補丁的補丁和對象的字段

[英]Patch and Object's Field with unittest.mock Patch

我有一個 object

class Summary():
    __tablename__ = 'employeenames'
    name= Column('employeeName', String(128, collation='utf8_bin'))
    date = Column('dateJoined', Date)

我想用模擬 object 修補摘要

class Summary():
    __tablename__ = 'employeenames'
    name= Column('employeeName', String)
    date = Column('dateJoined', Date)

或者只是將名稱字段修補為name= Column('employeeName', String)

我這樣做的原因是我在 sqlite 中進行測試,並且一些僅適用於 Mysql 的查詢干擾了我的測試。

我認為模擬該列會很困難。 但是,您可以改為有條件地編譯Sqlite 的String類型,刪除排序規則。

import sqlalchemy as sa
from sqlalchemy import orm
from sqlalchemy.ext.compiler import compiles
from sqlalchemy.types import String


@compiles(String, 'sqlite')
def compile_varchar(element, compiler, **kw):
    type_expression = kw['type_expression']
    type_expression.type.collation = None
    return compiler.visit_VARCHAR(element, **kw)


Base = orm.declarative_base()


class Summary(Base):
    __tablename__ = 'employeenames'
    id = sa.Column(sa.Integer, primary_key=True)
    name = sa.Column('employeeName', sa.String(128, collation='utf8_bin'))
    date = sa.Column('dateJoined', sa.Date)


urls = ['mysql:///test', 'sqlite://']
for url in urls:
    engine = sa.create_engine(url, echo=True, future=True)
    Base.metadata.drop_all(engine)
    Base.metadata.create_all(engine)

此腳本為 MySQL 生成預期的 output:

CREATE TABLE employeenames (
    id INTEGER NOT NULL AUTO_INCREMENT, 
    `employeeName` VARCHAR(128) COLLATE utf8_bin, 
    `dateJoined` DATE, 
    PRIMARY KEY (id)
)

但刪除了 Sqlite 的排序規則:

CREATE TABLE employeenames (
    id INTEGER NOT NULL, 
    "employeeName" VARCHAR(128), 
    "dateJoined" DATE, 
    PRIMARY KEY (id)
)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM