当我在单元测试中使用Fixture和SqlAlchemy时,为什么我在测试期间无法确认对数据库的更改?

时间:2012-04-03 19:09:45

标签: sqlite sqlalchemy functional-testing fixture

我正在测试使用SqlAlchemy(v0.7.4)的消息处理器。在我的测试中,我使用Fixture (v1.4)与Sqlite建立和拆除临时数据库。我的夹具数据包括一个带有状态字段的文件表,该字段应该在处理器运行时得到更新。

我已经确认测试,正在测试的处理器和灯具都共享相同的数据库会话。

我在运行处理器之前和之后查询文件记录中的状态字段。该值应该更改(从表示“Processing”的int变为“Complete”)。我在处理器中添加了调试代码,以验证是否正在使用正确的新状态值更新字段。我还可以通过检查处理器生成的输出文件的内容来独立验证处理器是否成功运行。但是,当我使用我的测试数据库会话在测试结束时查询状态时,它始终与开头的值相同。

我尝试在最终状态查询之前显式提交和刷新会话。什么都行不通。有什么想法吗?

1 个答案:

答案 0 :(得分:3)

这里的问题有两个:1)我的测试是在内存中使用临时的Sqlite数据库。 2)在我的功能测试中,处理器正在新进程中生成。

所以尽管我已经攻击了处理器类以使用与测试本身相同的数据库会话,但由于处理器和数据库位于不同的内存空间中,因此处理器所做的数据库更新对于测试代码是不可见的,试图验证结果

解决方案:设置临时Sqlite数据库in-file rather than in-memory

此外,我发现,当Fixture进行拆卸时,如果您的灯具数据与设置状态不同(如this section末尾所述),则会抛出错误。但这是一个单独的问题。