- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
在我的应用程序中,每个模型都有一个类来保存常用查询(我猜它有点像 DDD 语言中的“存储库”)。这些类中的每一个都被传递给 SQLAlchemy session 对象,以在构造时创建查询。我在确定断言某些查询正在我的单元测试中运行的最佳方法时遇到了一些困难。使用无处不在的博客示例,假设我有一个包含列和属性“日期”和“内容”的“帖子”模型。我还有一个带有方法“find_latest”的“PostRepository”,它应该按“日期”降序查询所有帖子。它看起来像:
from myapp.models import Post
class PostRepository(object):
def __init__(self, session):
self._s = session
def find_latest(self):
return self._s.query(Post).order_by(Post.date.desc())
我在模拟 Post.date.desc() 调用时遇到问题。现在我正在单元测试中为 Post.date.desc 修补一个模拟,但我觉得可能有更好的方法。
编辑:我正在为模拟对象使用 mox,我当前的单元测试看起来像:
import unittest
import mox
class TestPostRepository(unittest.TestCase):
def setUp(self):
self._mox = mox.Mox()
def _create_session_mock(self):
from sqlalchemy.orm.session import Session
return self._mox.CreateMock(Session)
def _create_query_mock(self):
from sqlalchemy.orm.query import Query
return self._mox.CreateMock(Query)
def _create_desc_mock(self):
from myapp.models import Post
return self._mox.CreateMock(Post.date.desc)
def test_find_latest(self):
from myapp.models.repositories import PostRepository
from myapp.models import Post
expected_result = 'test'
session_mock = self._create_session_mock()
query_mock = self._create_query_mock()
desc_mock = self._create_desc_mock()
# Monkey patch
tmp = Post.date.desc
Post.date.desc = desc_mock
session_mock.query(Post).AndReturn(query_mock)
query_mock.order_by(Post.date.desc().AndReturn('test')).AndReturn(query_mock)
query_mock.offset(0).AndReturn(query_mock)
query_mock.limit(10).AndReturn(expected_result)
self._mox.ReplayAll()
r = PostRepository(session_mock)
result = r.find_latest()
self._mox.VerifyAll()
self.assertEquals(expected_result, result)
Post.date.desc = tmp
这确实有效,但感觉很难看,而且我不确定为什么没有“Post.date.desc().AndReturn('test')”的“AndReturn('test')”片段会失败
最佳答案
我认为使用模拟来测试您的查询并不会真正让您受益匪浅。测试应该是测试代码的逻辑,而不是实现。更好的解决方案是创建一个新的数据库,向其中添加一些对象,在该数据库上运行查询,然后确定您是否得到了正确的结果。例如:
# Create the engine. This starts a fresh database
engine = create_engine('sqlite://')
# Fills the database with the tables needed.
# If you use declarative, then the metadata for your tables can be found using Base.metadata
metadata.create_all(engine)
# Create a session to this database
session = sessionmaker(bind=engine)()
# Create some posts using the session and commit them
...
# Test your repository object...
repo = PostRepository(session)
results = repo.find_latest()
# Run your assertions of results
...
现在,您实际上是在测试代码的逻辑。这意味着您可以更改方法的实现,但只要查询正常工作,测试仍应通过。如果需要,您可以将此方法编写为获取所有对象的查询,然后对结果列表进行切片。测试会通过,正如它应该的那样。稍后,您可以更改实现以使用 SA 表达式 API 运行查询,测试将通过。
要记住的一件事是,您可能会遇到 sqlite 的行为与其他数据库类型不同的问题。使用内存中的 sqlite 可以进行快速测试,但如果您想认真对待这些测试,您可能希望针对您将在生产中使用的相同类型的数据库运行它们。
关于Python SQLAlchemy - 模拟模型属性的 "desc"方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5121595/
我有一个小程序,我不想再在浏览器中运行,而是想通过 JNLP 作为可下载、自动更新、可离线的 Java 应用程序运行。 我不想保留将其作为小程序运行的能力。 无论是将现有的小程序包装在 JFrame
我认为我没有做任何过于复杂的事情。我正在对一个大型 csv 数据文件进行预排序,因为它充满了按随机时间顺序到达的数据。索引正确,但返回格式不正确。 sortedList=sorted(read
我在GraphicalLayout中添加了一个ImageView,但它在我的实际设备上看起来与在AVD上不同。。我发现我需要在一个布局.xml中添加Content Description,但是当我添加
表格如下: CREATE TABLE `api_stats` ( `id` int(11) NOT NULL AUTO_INCREMENT, `ip` varchar(30) DEFAULT NU
我的表有百万条记录。我只想提取最后 200 行中计数器最多的 5 行。 我正在使用它,但我认为这是两次选择.. 这可能不适合最佳性能,请提出建议。 "select * from (
我正在尝试为 hg log 创建一个自定义模板,其中一部分显示第一行的前 N(例如 72)个字符。基于this answer到目前为止我收到的另一个问题: hg log --template '{de
这里我们有一个带连字符的字符串,如 0-1-3.... 并且长度不固定,我们在hive中还有一个DETAIL表来解释每个代码的含义。 详情 |代码 |描述 | + ---- + ---- + | 0
它应该列出一个列表,并在顶部列出最高百分比..但它没有 https://gyazo.com/ecde864ef09115b8b119eba8a39ecd68这是我运行时的图片 这里是代码。怎么了? $
我正在尝试根据论坛 ID 获取所有主题。这些主题需要首先按粘性排序,然后按最后发布日期排序。 我有这个查询,工作得几乎正常,但它没有按照我想要的方式对主题进行排序。 SELECT forum_
我在数据库中创建了一个表并添加了一些约束。当我在表上使用 DESC 关键字时,根据我放置的约束,“Key”列会更改其记录。 这是表定义: CREATE TABLE t( sif INT, sif
我有一个获取两行的查询 - SELECT tb.type, tb.value, tb.comp, tb.
我在 SQL 中有这个查询 SELECT Book FROM Library ORDER BY Book desc 我想要的排序 [Expired]Web Publishing Co., Ltd. [
我正在使用 DataTables 来显示一些数据,它效果很好,但我想稍微自定义它,但不确定如何。 我想要做的是,当用户单击列标题对该列进行排序时,我希望它最初按降序而不是升序排序。有什么办法可以做到这
我有这个 SQL(SQLite 数据库),它正确地从按 session ID 分组的消息表中获取最新消息,其中消息的 session ID 不是“无”。 SELECT * from messages
我想要 desc 表;操作以显示列的注释。我已经看到有些人做到了这一点,但我不知道如何。也许这取决于 SQL Developer 版本,我的是 2.1.0.63。数据库是Oracle 11g。 这是我
我正在检索 SQL 中的一些数据,按 DESC 排序。然后我想反转结果。我是通过将数据插入数组然后使用 array_reverse 来做到这一点的,但我发现这对 CPU 时间来说非常繁重,并且只想使用
我正在按日期降序从数据库中获取一些数据,并使用shift-push通过循环将其添加到数组中,因为新数据不断定期到达。 我无法理解的一件奇怪的事情是为什么第一个获取的值被添加到最后一个索引。 这是我的代
我有一个问题,我不知道如何解决。我有这个查询: $sql = "SELECT * FROM transfer_centre WHERE status = 'out' ORDER BY pris DES
我有 2 个 MYSQL 表,firma 和 rach 公司表: id_fir | nazwa | opis | nr_konta | logo-------------------------
我希望得到一些帮助:我正在尝试输出一个用户可以通过各种选择字段查看和排列的 mysql 数据表。我希望数据按日期顺序自动排列(最新的在前)并且每页限制为 10 个结果。 我有以下脚本摘录(为简洁起见,
我是一名优秀的程序员,十分优秀!