2012-05-01 66 views
9

我在我的网站的主页上使用ElasticSearch。在我的验收测试中,当用户登录时,他被重定向到主页。ElasticSearch +轮胎:模拟ES的好策略

但是在测试中使用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 

所以我需要在测试确实不具有“模拟”的搜索,而不是使用ES:弹性元数据。

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

回答

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的嘲笑过真正的电话获得优先权,但是我发现当某些东西产生unmocked的HTTP调用时,它有助于在测试中抛出一个异常。

您可以在此扩展以使用测试元数据来根据需要启用或禁用模拟。

+0

谢谢,我会试试:) – Robin