gpt4 book ai didi

mysql - rspec 可以在同一测试中更改和使用 innodb 全文索引吗?

转载 作者:行者123 更新时间:2023-11-29 03:32:19 27 4
gpt4 key购买 nike

我有一个奇怪的具体问题。假设我在 Rails 项目中有这张表:

create_table "documents", force: true do |t|
t.text "tags"
end
add_index "documents", ["tags"], name: "index_documents_on_tags", type: :fulltext

我有一个集成测试,它创建了几个具有不同标记组合的 Document 实例,我尝试测试的方法应该通过全文搜索返回。不幸的是,事实证明 InnoDB 在当前事务结束之前不会重建其全文索引,这意味着我的搜索结果为空。

如果我在固定装置中构建测试数据(例如,提前,在 rspec 用于每个测试的事务之外)它一切正常,但是我有什么方法可以调整数据并在其中运行搜索同一个测试?

最佳答案

棘手但可以修复。请耐心等待。

第一步

添加@mattias ( https://stackoverflow.com/a/7703220/537648 ) 的这个好 helper

def without_transactional_fixtures(&block)
self.use_transactional_fixtures = false

before(:all) do
DatabaseCleaner.strategy = :truncation
end

yield

after(:all) do
DatabaseCleaner.strategy = :transaction
end
end

第二步

将此 before block 添加到您的 rspec 示例中

示例用法:

describe "doing my thing" do
before do
# This will rebuild the indexes. You need it before each example
ActiveRecord::Base.connection.execute("ANALYZE TABLE `searchables`")
end

without_transactional_fixtures do
it "does something without transaction fixtures" do
...
end
end
end

奖励步骤

如果您遇到此错误:

ActiveRecord::StatementInvalid: Mysql2::Error: SAVEPOINT active_record_1 does not exist: ROLLBACK TO SAVEPOINT active_record_1

使用 FactoryBot/FactoryGirl 时要小心。如果您需要为可搜索表创建对象,请使用 let! 而不是 let

例子:

describe '.search' do
without_transactional_fixtures do
let! (:campaign0) { create(:campaign, io_number: 'C0-1234-4321', status: 'completed') }
let! (:campaign1) { create(:campaign, io_number: "C1-4321-4321") }

before do
ActiveRecord::Base.connection.execute("ANALYZE TABLE `searchables`")
end
...

谢谢@awaage ( https://stackoverflow.com/a/13732210/537648 )

关于mysql - rspec 可以在同一测试中更改和使用 innodb 全文索引吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28818837/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com