diff --git a/src/CSharpFunctionalExtensions.FluentAssertions/ResultExtensions.cs b/src/CSharpFunctionalExtensions.FluentAssertions/ResultExtensions.cs index b6bdd3d..4abe633 100644 --- a/src/CSharpFunctionalExtensions.FluentAssertions/ResultExtensions.cs +++ b/src/CSharpFunctionalExtensions.FluentAssertions/ResultExtensions.cs @@ -46,4 +46,22 @@ public AndConstraint Fail(string because = "", params object[] return new AndConstraint(this); } + + /// + /// Asserts a result is a failure with a specified error. + /// + /// + /// + /// + /// + public AndConstraint FailWith(string error, string because = "", params object[] becauseArgs) + { + Execute.Assertion + .BecauseOf(because, becauseArgs) + .Given(() => Subject.IsFailure) + .ForCondition(b => Subject.Error!.Equals(error)) + .FailWith($"Expected {{context:result}} error to be {{0}}, but found {{1}}", error, Subject.Error); + + return new AndConstraint(this); + } } diff --git a/src/CSharpFunctionalExtensions.FluentAssertions/ResultTExtensions.cs b/src/CSharpFunctionalExtensions.FluentAssertions/ResultTExtensions.cs index 6224b1b..f354d85 100644 --- a/src/CSharpFunctionalExtensions.FluentAssertions/ResultTExtensions.cs +++ b/src/CSharpFunctionalExtensions.FluentAssertions/ResultTExtensions.cs @@ -53,7 +53,7 @@ public AndConstraint> SucceedWith(T value, string because = } /// - /// Asserts a result is a failure + /// Asserts a result is a failure. /// /// /// @@ -67,4 +67,22 @@ public AndConstraint> Fail(string because = "", params obje return new AndConstraint>(this); } + + /// + /// Asserts a result is a failure with a specified error. + /// + /// + /// + /// + /// + public AndConstraint> FailWith(string error, string because = "", params object[] becauseArgs) + { + Execute.Assertion + .BecauseOf(because, becauseArgs) + .Given(() => Subject.IsFailure) + .ForCondition(b => Subject.Error!.Equals(error)) + .FailWith($"Expected {{context:result}} error to be {{0}}, but found {{1}}", error, Subject.Error); + + return new AndConstraint>(this); + } } diff --git a/src/CSharpFunctionalExtensions.FluentAssertions/UnitResultExtensions.cs b/src/CSharpFunctionalExtensions.FluentAssertions/UnitResultExtensions.cs index c7abb42..72d802e 100644 --- a/src/CSharpFunctionalExtensions.FluentAssertions/UnitResultExtensions.cs +++ b/src/CSharpFunctionalExtensions.FluentAssertions/UnitResultExtensions.cs @@ -15,7 +15,7 @@ public UnitResultAssertions(UnitResult instance) : base(instance) { } protected override string Identifier => "Result"; /// - /// Asserts a unit result is a success. + /// Asserts a UnitResult is a success. /// /// /// @@ -31,7 +31,7 @@ public AndConstraint> Succeed(string because = "", param } /// - /// Asserts a unit result is a failure. + /// Asserts a UnitResult is a failure. /// /// /// @@ -47,7 +47,7 @@ public AndConstraint> Fail(string because = "", params o } /// - /// Asserts a unit result is a failure with a specified error. + /// Asserts a UnitResult is a failure with a specified error. /// /// /// diff --git a/tests/CSharpFunctionalExtensions.FluentAssertions.Tests/ResultAssertionTests.cs b/tests/CSharpFunctionalExtensions.FluentAssertions.Tests/ResultAssertionTests.cs index 6f7c87a..2dde4ae 100644 --- a/tests/CSharpFunctionalExtensions.FluentAssertions.Tests/ResultAssertionTests.cs +++ b/tests/CSharpFunctionalExtensions.FluentAssertions.Tests/ResultAssertionTests.cs @@ -25,15 +25,17 @@ public void WhenResultIsExpectedToHaveValueItShouldNotBeFailure() } [Fact] - public void WhenResultIsExpectedToHaveErrorItShouldNotBeFailure() + public void WhenResultIsExpectedToHaveErrorFailShouldNotThrow() { - var result = Result.Failure("error"); + string error = "error"; + var result = Result.Failure(error); result.Should().Fail(); + result.Should().FailWith(error); } [Fact] - public void WhenResultIsExpectedToHaveErrorItShouldBeFailure() + public void WhenResultIsExpectedToHaveErrorSucceedShouldThrow() { var result = Result.Failure("error"); diff --git a/tests/CSharpFunctionalExtensions.FluentAssertions.Tests/ResultTAssertionsTests.cs b/tests/CSharpFunctionalExtensions.FluentAssertions.Tests/ResultTAssertionsTests.cs index 576925d..e001c79 100644 --- a/tests/CSharpFunctionalExtensions.FluentAssertions.Tests/ResultTAssertionsTests.cs +++ b/tests/CSharpFunctionalExtensions.FluentAssertions.Tests/ResultTAssertionsTests.cs @@ -44,17 +44,19 @@ public void WhenResultIsExpectedToHaveValueItShouldNotBeSuccessfulWithDifferentV } [Fact] - public void WhenResultIsExpectedToHaveErrorItShouldNotBeFailure() + public void WhenResultIsExpectedToHaveErrorFailShouldNotThrow() { - var result = Result.Failure("error"); + string error = "error"; + var result = Result.Failure(error); result.Should().Fail(); + result.Should().FailWith(error); } [Fact] - public void WhenResultIsExpectedToHaveErrorItShouldBeFailure() + public void WhenResultIsExpectedToHaveErrorSucceedShouldThrow() { - var result = Result.Failure("error"); + var result = Result.Failure("error"); var action = () => result.Should().Succeed();