【发布时间】:2019-07-24 19:29:32
【问题描述】:
我正在向 Django 项目添加搜索引擎,因此在几个模型上设置了 SearchVectorFields,并带有自定义触发器。
我想对我的 TSVECTOR 类型的列进行单元测试,以确保在模型实例更改时更新。
但是,我一直无法找到有关如何测试 SearchVectorField 内容的任何信息...我无法将 my_document.search 与 SearchVector(Value("document content")) 或类似内容进行比较,因为第一个似乎是字符串-像,而后者是一个对象。
TL;DR
更准确地说,使用模型:
from django.db import models
class Document(models.Model):
...
content = TextField()
search = SearchVectorField()
和触发:
-- create trigger function
CREATE OR REPLACE FUNCTION search_trigger() RETURNS trigger AS $$
begin
NEW.search := to_tsvector(COALESCE(NEW.content, ''))
return NEW;
end
$$ LANGUAGE plpgsql;
-- add trigger on insert
DROP TRIGGER IF EXISTS search_trigger ON myapp_document;
CREATE TRIGGER search_trigger
BEFORE INSERT
ON myapp_document
FOR EACH ROW
EXECUTE PROCEDURE search_trigger();
-- add trigger on update
DROP TRIGGER IF EXISTS search_trigger_update ON myapp_document;
CREATE TRIGGER search_trigger_update
BEFORE UPDATE OF content
ON myapp_document
FOR EACH ROW
WHEN (OLD.content IS DISTINCT FROM NEW.content)
EXECUTE PROCEDURE search_trigger();
我如何测试当我创建一个新的Document 实例时,它的search 字段填充了正确的值?更新现有 Document 实例的问题相同,但答案应该非常相似。
感谢任何提示;)
【问题讨论】:
标签: django postgresql unit-testing full-text-search django-queryset