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 Classdotnet new mstest -lang VB -n MyApp.Tests
dotnet add MyApp.Tests reference MyApp.Core
dotnet test46.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())