我不明白如何测试我的存储库。
我想确定我确实将所有参数的对象保存到数据库中,当我执行我的SQL语句时,我真的收到了我想要的内容。
但是,我不能在"CREATE TABLE test_table
单元测试的方法中放置setUp
因为它会被多次创建(同一测试用例的测试是并行运行的)。所以,只要我创建同一个类中的2个方法需要在同一个表上工作,它不起作用(表的名称冲突)
同样,我不能放"CREATE TABLE test_table"
setUpModule
,因为现在表创建了一次,但由于测试是并行运行的,所以没有什么能阻止多次插入同一个对象表,打破了某些领域的单一性约束。
同样,我在每个方法中都不能"CREATE SCHEMA some_random_schema_name"
,因为我需要为给定的数据库全局“SET search_path TO ...”,因此并行运行的每个方法都会受到影响。
我看到的唯一方法是为每个测试创建"CREATE DATABASE"
,并使用唯一的名称,并建立与每个数据库的invidual连接。这看起来非常浪费。还有更好的方法吗?
另外,我不能在内存中使用SQLite,因为我需要测试PostgreSQL。
答案 0 :(得分:5)
最佳解决方案是使用testing.postgresql
模块。这将在用户空间中触发数据库,然后在运行结束时再次删除它。您可以将以下内容放在unittest套件中 - 在var maps = [{
template: "pref-color-template",
destination: "pref-color"
}, {
template: "pref-red-template",
destination: "pref-red"
}, {
template: "pref-white-template",
destination: "pref-white"
}, {
template: "pref-country-template",
destination: "pref-country"
}, {
template: "pref-style-template",
destination: "pref-style"
}];
var compileTemplate = function (template, destination, data) {
var templ = Handlebars.compile(document.getElementById(template).innerHTML);
var output = templ(data);
document.getElementById(destination).innerHTML = output;
}
for (var i = 0; i < maps.length; i++) {
compileTemplate(maps[i].template, maps[i].destination, colorData);
}
,setUp
或setUpClass
- 取决于您想要的持久性:
setUpModule
如果您希望数据库在测试之间/之后保持不变,您可以使用import testing.postgresql
def setUp(self):
self.postgresql = testing.postgresql.Postgresql(port=7654)
# Get the url to connect to with psycopg2 or equivalent
print(self.postgresql.url())
def tearDown(self):
self.postgresql.stop()
选项运行它来设置目录 - 这将阻止它在关闭后被删除:
base_dir
在测试之外,它还可以用作上下文管理器,在退出with块时它会自动清理和关闭:
name = "testdb"
port = "5678"
path = "/tmp/my_test_db"
testing.postgresql.Postgresql(name=name, port=port, base_dir=path)