namespace Ocelot.UnitTests.ServiceDiscovery { using System; using System.Collections.Generic; using Moq; using Ocelot.Logging; using Ocelot.ServiceDiscovery.Providers; using Ocelot.Values; using Xunit; using TestStack.BDDfy; using Shouldly; using static Ocelot.Infrastructure.Wait; public class PollingConsulServiceDiscoveryProviderTests { private readonly int _delay; private PollingConsulServiceDiscoveryProvider _provider; private readonly List _services; private readonly Mock _factory; private readonly Mock _logger; private readonly Mock _consulServiceDiscoveryProvider; private List _result; public PollingConsulServiceDiscoveryProviderTests() { _services = new List(); _delay = 1; _factory = new Mock(); _logger = new Mock(); _factory.Setup(x => x.CreateLogger()).Returns(_logger.Object); _consulServiceDiscoveryProvider = new Mock(); } [Fact] public void should_return_service_from_consul() { var service = new Service("", new ServiceHostAndPort("", 0), "", "", new List()); this.Given(x => GivenConsulReturns(service)) .When(x => WhenIGetTheServices(1)) .Then(x => ThenTheCountIs(1)) .BDDfy(); } private void GivenConsulReturns(Service service) { _services.Add(service); _consulServiceDiscoveryProvider.Setup(x => x.Get()).ReturnsAsync(_services); } private void ThenTheCountIs(int count) { _result.Count.ShouldBe(count); } private void WhenIGetTheServices(int expected) { _provider = new PollingConsulServiceDiscoveryProvider(_delay, "", _factory.Object, _consulServiceDiscoveryProvider.Object); var result = WaitFor(3000).Until(() => { try { _result = _provider.Get().GetAwaiter().GetResult(); if(_result.Count == expected) { return true; } return false; } catch(Exception) { return false; } }); result.ShouldBeTrue(); } } }