Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to replace Assert.Fail() with FluentAssertions

We are currently converting some code that was using Assert.IsTrue(), Assert.AreEqual(), Assert.IsNotNull(), etc. The basic unit test assert Library for C#

We want to use FluentAssertions, like value.Should().BeNull().

I'm stuck on a few tests using Assert.Fail() in some locations. What should I use to efficiently replace those, since we want to do away with every single "Assert.*", and I can't find an equivalent in FluentAssertions?

Here is an example

[TestMethod, TestCategory("ImportantTest")]
public void MethodToTest_Circumstances_ExpectedResult()
{
    // Arrange
    var variable1 = new Type1() { Value = "hello" };
    var variable2 = new Type2() { Name = "Bob" };

    // Act
    try
    {
        MethodToTest(variable1, variable2);
        // This method should have thrown an exception
        Assert.Fail();
    }
    catch (Exception ex)
    {
        ex.Should().BeOfType<DataException>();
        ex.Message.Should().Be(Constants.DataMessageForMethod);
    }

    // Assert
    // test that variable1 was changed by the method
    variable1.Should().NotBeNull();
    variable1.Value.Should().Be("Hello!");
    // test that variable2 is unchanged because the method threw an exception before changing it
    variable2.Should().NotBeNull();
    variable2.Name.Should().Be("Bob");
}
like image 656
Kaito Kid Avatar asked Jul 11 '17 13:07

Kaito Kid


People also ask

What is Fluentassertions?

Fluent Assertions is a set of . NET extension methods that allow you to more naturally specify the expected outcome of a TDD or BDD-style unit test.

What is fluent assertions C#?

Fluent Assertions is a . NET library that provides use with a bunch of useful extension methods that allow us to test our C# code in a more natural way.


2 Answers

Restructure the test to utilize the .ShouldThrow<> assertion extension.

[TestMethod, TestCategory("ImportantTest")]
public void MethodToTest_Circumstances_ExpectedResult() {
    // Arrange
    var variable1 = new Type1() { Value = "hello" };
    var variable2 = new Type2() { Name = "Bob" };

    // Act
    Action act = () => MethodToTest(variable1, variable2);       

    // Assert
    // This method should have thrown an exception
    act.ShouldThrow<DataException>()
       .WithMessage(Constants.DataMessageForMethod);
    // test that variable1 was changed by the method
    variable1.Should().NotBeNull();
    variable1.Value.Should().Be("Hello!");
    // test that variable2 is unchanged because the method threw an exception before changing it
    variable2.Should().NotBeNull();
    variable2.Name.Should().Be("Bob");
}

In the above example, if the expected exception is not thrown the the assertion would fail, stopping the test case.

You should review the documentation on asserting exceptions to get a better understanding of how to use the library.

like image 71
Nkosi Avatar answered Sep 28 '22 07:09

Nkosi


Following the example in here, he just dealt away with the Assert.Fail -- and use action and .ShouldThrow http://www.continuousimprover.com/2011/07/why-i-created-fluent-assertions-in.html

like image 26
hsoesanto Avatar answered Sep 28 '22 07:09

hsoesanto