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);
}
}
}
SHARE: