standards-c-sharp

Tests should be short and simple

Don’t

Here, all the behavior of the class is tested in a single method.

[TestFixture()]
public class PillViewModelBuilderTests
{
    private Mock<IPerksListBreakdownBuilder> _perksListBreakdownBuilder;
    
        private List<FreebiesItem> CreatePillsList()
        {
            return new List<FreebiesItem>()
            {
                new FreebiesItem() { Name = "Apple TV", Icon = "ficon-apple-tv" },
                new FreebiesItem() { Name = "Iphone", Icon = "ficon-iphone" },
                new FreebiesItem() { Name = "Mac", Icon = "ficon-mac" },
                new FreebiesItem() { Name = "Ipad", Icon = "ficon-ipad" },
                new FreebiesItem() { Name = "Apple Watch", Icon = "ficon-apple-watch" }
            };
        }
                
        [Test()]
        [TestCase(2, true, "+3 More")]
        [TestCase(5, false, "+5 More")]
        public void PillViewModelBuilderTest(int perklist, bool expectedShowTeaser, string expectedTeaser)
        {
            var pillsList = CreatePillsList();
        
            _perksListBreakdownBuilder = new Mock<IPerksListBreakdownBuilder>();
            _perksListBreakdownBuilder.Setup(x => x.CalculateHighlightedIndex(It.IsAny<List<string>>(), It.IsAny<string>(), It.IsAny<string>(), 25)).Returns(perklist);
        
            PillViewModelBuilder pillBuilder = new PillViewModelBuilder(_perksListBreakdownBuilder.Object);
        
            var pillArgs = new PillArgs()
            {
                PillStyle = "green-pill",
                PillTitleText = "Title",
                PillTooltipText = "Tooltip",
                TeaserTemplate = "+{0} More"
            };
        
        
            // Check Pill Title, style and tooltip mapping 
            var pills =  pillBuilder.Build(pillsList, pillArgs);
            Assert.AreEqual("Title", pills.PillText);
            Assert.AreEqual("Tooltip", pills.PillTooltipText);
            Assert.AreEqual(expectedTeaser, pills.PillTeaserText);
            Assert.AreEqual("green-pill", pills.StyleName);
        
            // Check inside Pills list mapping 
            for (int i = 0; i < pillsList.Count; ++i)
            {
                Assert.AreEqual(pillsList[i].Name, pills.PillList[i].Name);
                Assert.AreEqual(pillsList[i].Icon, pills.PillList[i].Icon);
            }
        
            // Check pill breakdown teaser 
            Assert.AreEqual(expectedShowTeaser, pills.ShouldShowTeaser);
        }
    }
}

Do

Now we are testing one requirement at a time.

[TestFixture()]
public class PillViewModelBuilderTests
{
    private List<FreebiesItem> _freebiesItems;
    private Mock<IPerksListBreakdownBuilder> _perksListBreakdownBuilder;
    private PillArgs _pillArgs;

    [SetUp]
    public void SetUp()
    {
        _perksListBreakdownBuilder = new Mock<IPerksListBreakdownBuilder>();
        
        _freebiesItems = new List<FreebiesItem>
        {
            new FreebiesItem { Name = "Apple TV", Icon = "ficon-apple-tv" },
            new FreebiesItem { Name = "Iphone", Icon = "ficon-iphone" },
            new FreebiesItem { Name = "Mac", Icon = "ficon-mac" },
            new FreebiesItem { Name = "Ipad", Icon = "ficon-ipad" },
            new FreebiesItem { Name = "Apple Watch", Icon = "ficon-apple-watch" }
        };
        
        _pillArgs = new PillArgs
        {
            PillStyle = "green-pill",
            PillTitleText = "Title",
            PillTooltipText = "Tooltip",
            TeaserTemplate = "+{0} More",
            MaxTooltipItems = Int32.MaxValue
        };
    }

    [Test]
    public void Build_SetsBasicProperties()
    {
        var perksListBreakdownBuilderMock = new Mock<IPerksListBreakdownBuilder>();
        var pillArgs = new PillArgs
        {
            PillStyle = "green-pill",
            PillTitleText = "Title",
            PillTooltipText = "Tooltip",
            TeaserTemplate = "+{0} More"
        };   
        var pillBuilder = new PillViewModelBuilder(perksListBreakdownBuilderMock.Object);

        var pills =  pillBuilder.Build(_freebiesItems, pillArgs);
        
        Assert.AreEqual("Title", pills.PillText);
        Assert.AreEqual("Tooltip", pills.PillTooltipText);
        Assert.AreEqual("green-pill", pills.StyleName);
    }

    [Test]
    [TestCase(0, "+5 More")]
    [TestCase(1, "+4 More")]
    public void Build_SetsCorrectTeaserText(int highlightedIndex, string expectedTeaser)
    {
        _perksListBreakdownBuilder
            .Setup(x => x.CalculateHighlightedIndex(
                It.IsAny<List<string>>(), 
                It.IsAny<string>(), 
                It.IsAny<string>(),
                It.IsAny<int>()))
            .Returns(highlightedIndex);
        var pillBuilder = new PillViewModelBuilder(_perksListBreakdownBuilder.Object);
        
        var pills =  pillBuilder.Build(_freebiesItems, _pillArgs);
        
        Assert.AreEqual(expectedTeaser, pills.PillTeaserText);
    }

    [Test]
    [TestCase(5, false)]
    [TestCase(4, true)]
    [TestCase(0, true)]
    public void Build_SetsShowTeaserFlag(int highlightedIndex, bool expectedShowTeaser)
    {
        _perksListBreakdownBuilder
            .Setup(x => x.CalculateHighlightedIndex(
                It.IsAny<List<string>>(), 
                It.IsAny<string>(), 
                It.IsAny<string>(),
                It.IsAny<int>()))
            .Returns(highlightedIndex);
        var pillBuilder = new PillViewModelBuilder(_perksListBreakdownBuilder.Object);
        
        var pills =  pillBuilder.Build(_freebiesItems, _pillArgs);
        
        Assert.AreEqual(expectedShowTeaser, pills.ShouldShowTeaser);
    }
    
    [Test]
    public void Build_MapsFreebiesToPillList()
    {
        var pillBuilder = new PillViewModelBuilder(_perksListBreakdownBuilder.Object);
        
        var pills =  pillBuilder.Build(_freebiesItems, _pillArgs);

        for (int i = 0; i < _freebiesItems.Count; ++i)
        {
            Assert.AreEqual(_freebiesItems[i].Name, pills.PillList[i].Name);
            Assert.AreEqual(_freebiesItems[i].Icon, pills.PillList[i].Icon);
        }
    }

    [Test]
    [TestCase(0, 0)]
    [TestCase(4, 4)]
    [TestCase(5, 5)]
    [TestCase(6, 5)]
    public void Build_PillListLengthCappedAtMaxTooltipItems(int maxItems, int expectedListLength)
    {
        var pillBuilder = new PillViewModelBuilder(_perksListBreakdownBuilder.Object);
        _pillArgs.MaxTooltipItems = maxItems;
        
        var pills =  pillBuilder.Build(_freebiesItems, _pillArgs);

        Assert.AreEqual(expectedListLength, pills.PillList.Count);
    }
}