我想集成测试一个在ElasticSearch中存储数据的类。通常,我想使用测试类添加一些数据,然后检查Elastic上是否存在数据。
测试方法示例:
[SetUp]
public void Setup()
{
ElasticClient.DeleteByQuery(Indices.Index(IndexName), d =>
d.Query(x => x.MatchAll())
);
}
[Test]
public async Task GetAllConversations_ShouldReturnAllConversations()
{
// Arrange
Guid[] randomGuids = new[]
{
Guid.NewGuid(),
Guid.NewGuid(),
Guid.NewGuid(),
Guid.NewGuid(),
};
foreach (var randomGuid in randomGuids)
{
await _conversationStorage.AddMessage(randomGuid, new Message()
{
Text = "test",
Type = MessageType.UserMade
});
}
// Act
var result = await _sut.GetAllConversations();
// Assert
Assert.That(result?.Conversations.Count, Is.EqualTo(4));
}
(AddMessage
在内部执行IndexAsync
)
我的问题是,我的方法似乎是不确定的。它通常会通过(我可以看到数据出现在Elastic上),但有时不会。再次运行它会使测试再次通过。
我能否以某种方式确保最近添加的所有数据都在Elastic上建立了索引,并且我可以安全地执行“Assert”检查?
我使用Elastic.Clients.Elasticsearch
.NET库和ElasticSearch版本8.10.2
1条答案
按热度按时间yebdmbv41#
在elasticsearch中索引的文档在索引后不能立即搜索。我真的很惊讶它能起作用。我想你可能也不太会打扫。对于要在搜索中显示的文档,索引应该是refreshed。默认情况下,此操作每秒自动发生一次。但你可以强迫它。
在生产环境中,不建议在每次索引后强制执行刷新操作,因为这会导致性能下降,但在您的场景中,这完全没有问题。
另一个注意事项:通常,删除并重新创建索引比从索引中删除所有记录要快得多,也更干净。