Unit Testing

46.1 MSTest Example

Imports Microsoft.VisualStudio.TestTools.UnitTesting

<TestClass>
Public Class BankAccountTests

    Private _account As BankAccount

    <TestInitialize>
    Public Sub Setup()
        _account = New BankAccount("T-1", "Tester", 100D)
    End Sub

    <TestMethod>
    Public Sub Deposit_ValidAmount_IncreasesBalance()
        _account.Deposit(50D)
        Assert.AreEqual(150D, _account.Balance)
    End Sub

    <TestMethod>
    Public Sub Withdraw_MoreThanBalance_ReturnsFalse()
        Dim result = _account.Withdraw(500D)
        Assert.IsFalse(result)
        Assert.AreEqual(100D, _account.Balance)
    End Sub

    <TestMethod>
    <ExpectedException(GetType(ArgumentException))>
    Public Sub Deposit_NegativeAmount_Throws()
        _account.Deposit(-10D)
    End Sub

    <DataTestMethod>
    <DataRow(10, 110)>
    <DataRow(0.5, 100.5)>
    Public Sub Deposit_Various(amount As Double, expected As Double)
        _account.Deposit(CDec(amount))
        Assert.AreEqual(CDec(expected), _account.Balance)
    End Sub
End Class
dotnet new mstest -lang VB -n MyApp.Tests
dotnet add MyApp.Tests reference MyApp.Core
dotnet test

46.2 xUnit and NUnit

' xUnit
Imports Xunit
Public Class CalculatorTests
    <Fact>
    Public Sub Add_ReturnsSum()
        Assert.Equal(5, Calculator.Add(2, 3))
    End Sub

    <Theory>
    <InlineData(1, 2, 3)>
    <InlineData(-1, 1, 0)>
    Public Sub Add_Theory(a As Integer, b As Integer, expected As Integer)
        Assert.Equal(expected, Calculator.Add(a, b))
    End Sub
End Class

' NUnit: <TestFixture>, <Test>, <TestCase(1, 2, 3)>, Assert.That(result, [Is].EqualTo(3))

46.3 Mocking and Test Practices

AAA pattern (Arrange, Act, Assert). Test behavior, not implementation. Use dependency injection and interfaces to make code testable.

Tools: FluentAssertions (result.Should().Be(5)), NSubstitute, code coverage (coverlet, VS Enterprise), Live Unit Testing.

' Moq
Dim repo As New Mock(Of ICustomerRepository)()
repo.Setup(Function(r) r.GetById(1)).Returns(New Customer With {.Id = 1, .Name = "Ana"})
Dim service As New CustomerService(repo.Object)
Assert.AreEqual("Ana", service.GetName(1))
repo.Verify(Sub(r) r.GetById(1), Times.Once())