using System.Threading; using System.Threading.Tasks; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using Moq; using NucuCar.Sensors.Abstractions; using NucuCar.Sensors.Modules.BME680; using NucuCar.Telemetry.Abstractions; using NucuCar.UnitTests.NucuCar.Sensors.Bme680; using Xunit; namespace NucuCar.UnitTests.NucuCar.Sensors { /// /// Tests the functionality of the SensorWorker; Since the class is quite generic the test uses the /// Bme680Worker as an example. /// public class Bme680WorkerTest { private readonly Mock> _mockLogger; private readonly Mock> _mockOptions; private readonly Mock _mockSensorTelemetry; private readonly Mock _mockTestBme680Sensor; private readonly Mock> _mockBme680ISensor; private readonly CancellationTokenSource _cts; public Bme680WorkerTest() { _cts = new CancellationTokenSource(); _mockLogger = new Mock>(); _mockOptions = new Mock>(); _mockSensorTelemetry = new Mock(); _mockTestBme680Sensor = new Mock(); _mockBme680ISensor = new Mock>(); _mockBme680ISensor.Setup(o => o.Object).Returns(_mockTestBme680Sensor.Object); } [Fact] public async Task Test_Bme680Worker_SensorIsInitialized() { _mockOptions.Setup(o => o.Value).Returns(new Bme680Config() { Enabled = true, }); var service = new Bme680Worker(_mockLogger.Object, _mockSensorTelemetry.Object, _mockBme680ISensor.Object, new OptionsWrapper(new Bme680Config())); await service.StartAsync(_cts.Token); _mockTestBme680Sensor.Verify(s => s.Initialize(), Times.AtLeastOnce); await service.StopAsync(_cts.Token); } [Fact] public async Task Test_Bme680Worker_SensorIsBeingMeasured() { _mockOptions.Setup(o => o.Value).Returns(new Bme680Config() { Enabled = true, }); _mockTestBme680Sensor.Setup(s => s.GetState()).Returns(SensorStateEnum.Initialized); var service = new Bme680Worker(_mockLogger.Object, _mockSensorTelemetry.Object, _mockBme680ISensor.Object, new OptionsWrapper(new Bme680Config())); await service.StartAsync(_cts.Token); _mockTestBme680Sensor.Verify(s => s.Initialize(), Times.AtLeastOnce); _mockTestBme680Sensor.Verify(s => s.TakeMeasurementAsync(), Times.AtLeastOnce); await service.StopAsync(_cts.Token); } } }