Using Fluent Assertions, .NET developers can write more expressive and readable tests. Fluent Assertions is a library that provides a more natural way of writing assertions, making them easier to understand and maintain. By using Fluent Assertions, you can write more expressive and easier-to-read tests, making it easier to verify that your code is working as expected.
This article requires familliarity with unit testing.
Why use Fluent Assertions?
Fluent Assertions provides a more expressive way of writing assertions, making them more readable and easier to understand. Instead of using traditional assertions, which can be verbose and hard to read, Fluent Assertions provides a fluent interface that allows you to chain a series of expectations. For example, take the following traditional assertion:
Assert.AreEqual(expectedValue, actualValue, "Values should be equal");
With Fluent Assertions, the same assertion could be written as:
actualValue.Should().Be(expectedValue, because: "Values should be equal");
The Fluent Assertions version is much more readable and natural, making it easier to understand what the assertion is testing. If you want to skyrocket your C# career, check out our powerful ASP.NET full-stack web development course that also covers test-driven development.
How to use Fluent Assertions
To start using Fluent Assertions, after creating the test project, you need to install the FluentAssertions Nuget package.
dotnet add package FluentAssertions
Once installed, you can use it in your tests by adding the following using statement:
using FluentAssertions;
You can then use Fluent Assertions to write your assertions in your tests. Here’s an example of how to use Fluent Assertions (I used XUnit as the test framework here):
using FluentAssertions;
using Xunit;
namespace MyNamespace.Tests
{
public class MyTests
{
[Fact]
public void MyTest()
{
// Arrange
var expected = 3;
// Act
var actual = 1 + 2;
// Assert
actual.Should().Be(expected);
}
}
}
In this example, we’re using Fluent Assertions to assert that the value of actual is equal to the expected value of 3. If the assertion fails, Fluent Assertions will provide a clear and helpful error message telling you what went wrong.
Here are some examples of how to use Fluent Assertions:
using FluentAssertions;
using Xunit;
namespace MyNamespace.Tests;
public class FluentAssertionExamples
{
[Fact]
public void Objects_Should_Be_Equal()
{
// Arrange
var myObject = new { FirstName = "Mohsen", LastName = "Bazmi" };
var expectedObject = new { FirstName = "Mohsen", LastName = "Bazmi" };
// Act & Assert
myObject.Should().BeEquivalentTo(expectedObject);
}
[Fact]
public void Collection_Should_Contain_Item()
{
// Arrange
var expectedItem = "test";
var myCollection = new List<string> { "test" };
// Act & Assert
myCollection.Should().Contain(expectedItem);
}
[Fact]
public void String_Should_Contain_Substring()
{
// Arrange
var myString = "123456";
var expectedSubstring = "234";
// Act & Assert
myString.Should().Contain(expectedSubstring);
}
[Fact]
public void Value_Should_Be_Within_Range()
{
// Arrange
var myValue = 12;
var minValue = 0;
var maxValue = 20;
// Act & Assert
myValue.Should().BeInRange(minValue, maxValue);
}
[Fact]
public void Object_Should_Be_Of_Specific_Type()
{
// Arrange
var objOfType = new Person("Alexy", 3);
// Act & Assert
objOfType.Should().BeOfType<Person>();
}
[Fact]
public void Value_Should_Be_Null()
{
// Arrange
object? myNullValue = null;
// Act & Assert
myNullValue.Should().BeNull();
}
[Fact]
public void Dictionary_Should_Contain_Key_Value_Pair()
{
// Arrange
var expectedKey = "name";
var expectedValue = "Mohsen";
var myDictionary = new Dictionary<string, string>{
{"name","Mohsen"}
};
// Act & Assert
myDictionary.Should().ContainKey(expectedKey).And.ContainValue(expectedValue);
}
[Fact]
public void Collection_Should_Be_Empty()
{
// Arrange
var myEmptyCollection = new List<int>();
// Act & Assert
myEmptyCollection.Should().BeEmpty();
}
[Fact]
public void Value_Should_Be_Greater_Than_And_Less_Than()
{
// Act & Assert
12.Should().BeGreaterThan(0);
12.Should().BeLessThan(20);
}
[Fact]
public void Collection_Should_Only_Contain_Unique_Items()
{
// Arrange
var someCollection = Enumerable.Range(1, 20);
// Act & Assert
someCollection.Should().OnlyHaveUniqueItems();
}
[Fact]
public void Method_Should_Throw_Exception()
{
// Arrange
Action action = () => throw new NotImplementedException();
// Act & Assert
action.Should().Throw<Exception>();
}
}
public record class Person(string Name, int Age);
These are just a few examples of the many assertions provided by Fluent Assertions. You can find a full list of assertions in the Fluent Assertions documentation.
Conclusion
Fluent Assertions is a powerful library that can make your tests more expressive and readable. It provides a more natural way of writing assertions, making them easier to understand and maintain. If you haven’t tried it yet, I highly recommend trying it in your next project. By the way, did you know that we offer a unique online course that boosts your C# career? Check it out here!
