9

我在我的网站主页上使用 ElasticSearch。在我的验收测试中,当用户登录时,他会被重定向到主页。

但是在测试中使用 ES 很昂贵(需要创建和删除索引),所以我不想每次用户浏览主页时都必须这样做。

我只想在测试有一些元数据时才进行实际的 ES 搜索:

config.before(:each) do
    if example.metadata[:elastic]
        Model.create_elasticsearch_index
    end
end

scenario "Results should be ordered by distance", :elastic do
    # tests...
end

因此,当测试没有 :elastic 元数据时,我需要“模拟”搜索而不使用 ES。

什么是实现这一目标的好方法?

4

1 回答 1

12

我可能会使用FakeWeb选择性地启用和禁用实时 HTTP 调用。

模拟对 ES 的调用:

FakeWeb.allow_net_connect = false
FakeWeb.register_uri(:any, %r|\Ahttp://localhost:9200|, :body => "{}")

允许调用 ES:

FakeWeb.clean_registry
FakeWeb.allow_net_connect = true

这里并不严格要求允许和禁止网络连接,因为 FakeWeb 的模拟比实际调用优先,但我发现当某些东西进行未模拟的 HTTP 调用时,它有助于在测试中抛出异常。

您可能可以对此进行扩展,以根据需要使用测试元数据来启用或禁用模拟。

于 2012-05-02T04:06:01.023 回答