I was asked a question on Twitter so I thought I’d write it up here.
When using the FeatureToggle library you may have some some code that behaves differently if a toggle is enabled.
When writing a test, you can create a mock IFeatureToggle and set it up to be enabled (or not) and then assert the result is as expected.
The following code show a simple console app that has an OptionsConsoleWriter.Generate method that uses a toggle to output a printing feature option:
using static System.Console; using System.Text; using FeatureToggle.Toggles; using FeatureToggle.Core; namespace ConsoleApp1 { public class Printing : SimpleFeatureToggle {} public class OptionsConsoleWriter { public string Generate(IFeatureToggle printingToggle) { var sb = new StringBuilder(); sb.AppendLine("Options:"); sb.AppendLine("(e)xport"); sb.AppendLine("(s)ave"); if (printingToggle.FeatureEnabled) { sb.AppendLine("(p)rinting"); } return sb.ToString(); } } class Program { static void Main(string[] args) { Printing printingToggle = new Printing(); string options = new OptionsConsoleWriter().Generate(printingToggle); Write(options); ReadLine(); } } }
To write a couple of simple tests for this method, you can use a mocking framework such as Moq to generate a mocked IFeatureToggle and pass it to the Generate method:
using Xunit; using Moq; using FeatureToggle.Core; using ConsoleApp1; namespace ClassLibrary1.Tests { public class OptionsConsoleWriterTests { [Fact] public void ShouldGeneratePrintingOption() { var sut = new OptionsConsoleWriter(); var mockPrintingToggle = new Mock<IFeatureToggle>(); mockPrintingToggle.SetupGet(x => x.FeatureEnabled) .Returns(true); string options = sut.Generate(mockPrintingToggle.Object); Assert.Contains("(p)rinting", options); } [Fact] public void ShouldNotGeneratePrintingOption() { var sut = new OptionsConsoleWriter(); var mockPrintingToggle = new Mock<IFeatureToggle>(); mockPrintingToggle.SetupGet(x => x.FeatureEnabled) .Returns(false); string options = sut.Generate(mockPrintingToggle.Object); Assert.DoesNotContain("(p)rinting", options); } } }