NFluent 3.0.2.327-beta
See the version list below for details.
dotnet add package NFluent --version 3.0.2.327-beta
NuGet\Install-Package NFluent -Version 3.0.2.327-beta
<PackageReference Include="NFluent" Version="3.0.2.327-beta" />
paket add NFluent --version 3.0.2.327-beta
#r "nuget: NFluent, 3.0.2.327-beta"
// Install NFluent as a Cake Addin #addin nuget:?package=NFluent&version=3.0.2.327-beta&prerelease // Install NFluent as a Cake Tool #tool nuget:?package=NFluent&version=3.0.2.327-beta&prerelease
Chat
Build Status
NFluent is an assertion library which aims to fluent your .NET TDD experience.
Official site: http://www.n-fluent.net/
NFluent will make your tests:
- fluent to write: with a super-duper-happy auto-completion 'dot' experience. Indeed, just type the Check.That( followed by one of your objects and a dot, and your IDE will show you all the checks available for the type of the given object to verify. No more, no less (i.e. no auto completion flooding).
- fluent to read: very close to plain English, making it easier for non-technical people to read test code.
- fluent to troubleshoot: every failing check of the NFluent library throws an Exception with a crystal-clear message status to ease your TDD experience (see examples below). Thus, no need to set a breakpoint and to debug in order to be able to figure out what went wrong.
- helpful to reverse engineer legacy code: indeed, temporarily write an on-purpose failing assert on a legacy method, so you can understand it and leverage on the "ready-to-be-copied-and-paste-for-arrays-or-collections-initialization-purpose" NFluent assert failure messages.
- less error-prone: indeed, no more confusion about the order of the "expected" and "actual" values you can find in the classical .NET unit tests frameworks.
NFluent is directly inspired by the awesome Java FEST Fluent check/reflection library and it most famous fork AssertJ library.
NFluent & unit test frameworks
NFluent is not coupled to any .NET unit test framework. It is fully designed to work in collaboration with your favorite one.
Your favorite unit test framework (e.g. NUnit, xUnit, ...) will still handle the test identification, execution & Co. All you have to do is to replace your usage of its Assert
or Assert.That()
statements, by the Check.That()
NFluent statement form. That's all!
Indeed, we decided to use the Check.That()
syntax to avoid collisions and name ambiguity with the traditional Assert
class you can find in most of your .NET unit test frameworks (therefore, no need to declare an alias in your test fixtures).
In fact, test runners and check libraries are two orthogonal topics and concerns.
As simple as possible
With Nfluent check libraries:
All you've got to remember is: Check.That
, 'cause every check is then provided via a super-duper-auto-completion-dot-experience 😉
Usage sample
With NFluent, you can write simple checks like this:
var integers = new int[] { 1, 2, 3, 4, 5, 666 };
Check.That(integers).Contains(3, 5, 666);
integers = new int[] { 1, 2, 3 };
Check.That(integers).IsOnlyMadeOf(3, 2, 1);
var guitarHeroes = new[] { "Hendrix", "Paco de Lucia", "Django Reinhardt", "Baden Powell" };
Check.That(guitarHeroes).ContainsExactly("Hendrix", "Paco de Lucia", "Django Reinhardt", "Baden Powell");
var camus = new Person() { Name = "Camus" };
var sartre = new Person() { Name = "Sartre" };
Check.That(camus).IsNotEqualTo(sartre).And.IsInstanceOf<Person>();
var heroes = "Batman and Robin";
Check.That(heroes).Not.Contains("Joker").And.StartsWith("Bat").And.Contains("Robin");
int? one = 1;
Check.That(one).HasAValue().Which.IsStrictlyPositive().And.IsEqualTo(1);
const Nationality FrenchNationality = Nationality.French;
Check.ThatEnum(FrenchNationality).IsNotEqualTo(Nationality.Korean);
string motivationalSaying = "Failure is the mother of success.";
Check.That(motivationalSaying).IsNotInstanceOf<int>();
with NFluent, you can also write checks like this:
var persons = new List<Person>
{
new Person { Name = "Thomas", Age = 38 },
new Person { Name = "Achille", Age = 10, Nationality = Nationality.French },
new Person { Name = "Anton", Age = 7, Nationality = Nationality.French },
new Person { Name = "Arjun", Age = 7, Nationality = Nationality.Indian }
};
Check.That(persons.Extracting(nameof(Person.Name))).ContainsExactly("Thomas", "Achille", "Anton", "Arjun");
Check.That(persons.Extracting(nameof(Person.Age))).ContainsExactly(38, 10, 7, 7);
Check.That(persons.Extracting(nameof(Person.Nationality))).ContainsExactly(Nationality.Unknown, Nationality.French, Nationality.French, Nationality.Indian);
// more fluent than the following classical NUnit way, isn't it?
// CollectionAssert.AreEquivalent(persons.Properties(nameof(Person.Age)), new[] { 38, 10, 7, 7 });
// it's maybe even more fluent than the java versions
// FEST fluent assert v 2.x:
// assertThat(extractProperty("name" , String.class).from(inn.getItems())).containsExactly("+5 Dexterity Vest", "Aged Brie", "Elixir of the Mongoose", "Sulfuras, Hand of Ragnaros", "Backstage passes to a TAFKAL80ETC concert", "Conjured Mana Cake");
// FEST fluent assert v 1.x:
// assertThat(inn.getItems()).onProperty("name").containsExactly("+5 Dexterity Vest", "Aged Brie", "Elixir of the Mongoose", "Sulfuras, Hand of Ragnaros", "Backstage passes to a TAFKAL80ETC concert", "Conjured Mana Cake");
or like this:
// Works also with lambda for exception checking
Check.ThatCode(() => { throw new InvalidOperationException(); }).Throws<InvalidOperationException>();
// or execution duration checking
Check.ThatCode(() => Thread.Sleep(30)).LastsLessThan(60, TimeUnit.Milliseconds);
Why NFluent, and not another .NET fluent check framework?
- Because you think like us that writing a lambda expression within a check statement is not really a fluent experience (for reading as well as writing).
- Because NFluent is completely driven by the super-duper-happy-path principle to fluent your TDD experience. For instance, we consider the 'dot' autocompletion experience as crucial. Thus, it should not be polluted by things not related to the current unit testing context (which occurs with extension methods on classical .NET types - intellisense flooding).
- Because you think that those other check libraries have not chosen the proper vocabulary (
<subjectUnderTest>.Should().
... why don't they chooseMust
instead?!?). And thus, you'd rather rely on a stronger semantic for your checks (i.e. NFluent'sCheck.That
). - Because you like killing features and extra bonus, such as the Properties() extension method for IEnumerable for instance (as showed within the usage sample above).
- And because it's awesome pal. Try it, you will see!
Samples of crystal-clear error messages
Wanna try NFluent?
Can't be more easy: NFluent is available on nuget.org
Use cases
NFluent use cases are available here.
Newsgroup
For any comment, remark or question about the library, please use the NFluent-Discuss google group.
BackLog
Nfluent backlog is now available as github issues
New feature to be added?
- If you want to join the project and contribute: check this out before, but be our guest.
- If you don't want to contribute to the library, but you need a feature not yet implemented, don't hesitate to request it on the NFluent-Discuss google group. In any case: you are welcome!
Other resources
- Rui has published a great article about the NFluent extensibility model. Available here on CodeDistillers
Many thanks
To the other amazing contributors: Marc-Antoine LATOUR, Rui CARVALHO & Cyrille DUPUYDAUBY.
To Rui CARVALHO, for the nice NFluent logo he has designed.
To the mates that gave me ideas and feedbacks to make this lib as fluent as possible: Joel COSTIGLIOLA (former active contributor of Java FEST Assert, which now works on his AssertJ fork), Rui CARVALHO, Cyrille DUPUYDAUBY, Benoit LABAERE, ...
To Omer RAVIV, which supports the NFluent project by offering us some free licenses for the nice BugAid Visual Studio extensions.
To AppVeyor CI, which now supports NFluent builds.
thomas@pierrain.net / September 2016
Product | Versions Compatible and additional computed target framework versions. |
---|---|
.NET | net5.0 was computed. net5.0-windows was computed. net6.0 was computed. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 was computed. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. |
.NET Core | netcoreapp2.0 was computed. netcoreapp2.1 was computed. netcoreapp2.2 was computed. netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
.NET Standard | netstandard2.0 is compatible. netstandard2.1 was computed. |
.NET Framework | net35 is compatible. net40 was computed. net403 was computed. net45 was computed. net451 was computed. net452 was computed. net46 is compatible. net461 was computed. net462 was computed. net463 was computed. net47 was computed. net471 was computed. net472 was computed. net48 was computed. net481 was computed. |
MonoAndroid | monoandroid was computed. |
MonoMac | monomac was computed. |
MonoTouch | monotouch was computed. |
Tizen | tizen40 was computed. tizen60 was computed. |
Xamarin.iOS | xamarinios was computed. |
Xamarin.Mac | xamarinmac was computed. |
Xamarin.TVOS | xamarintvos was computed. |
Xamarin.WatchOS | xamarinwatchos was computed. |
-
.NETFramework 3.5
- No dependencies.
-
.NETFramework 4.6
- No dependencies.
-
.NETStandard 2.0
- No dependencies.
NuGet packages (15)
Showing the top 5 NuGet packages that depend on NFluent:
Package | Downloads |
---|---|
Krosoft.Extensions.Testing
Package pour faciliter la mise en place de tests. |
|
Seeq.Link.SDK.TestFramework
Framework for performing standard tests of Seeq C# connnectors |
|
Suzianna.Core
A library for writing flexible and easy to maintain acceptance tests |
|
TestableHttpClient.NFluent
NFluent checks for checking HttpResponseMessages. |
|
iago.lib
Iago is a tool to write bdd like tests in kre. use `iago.runner` to execute your tests |
GitHub repositories (18)
Showing the top 5 popular GitHub repositories that depend on NFluent:
Repository | Stars |
---|---|
ReClassNET/ReClass.NET
More than a ReClass port to the .NET platform.
|
|
zzzprojects/System.Linq.Dynamic.Core
The .NET Standard / .NET Core version from the System Linq Dynamic functionality.
|
|
WireMock-Net/WireMock.Net
WireMock.Net is a flexible product for stubbing and mocking web HTTP responses using advanced request matching and response templating. Based on the functionality from http://WireMock.org, but extended with more functionality.
|
|
MarcosMeli/FileHelpers
The FileHelpers are a free and easy to use .NET library to read/write data from fixed length or delimited records in files, strings or streams
|
|
WOA-Project/WoA-Installer-Rpi
This repository was deprecated, use:
|
Version | Downloads | Last updated |
---|---|---|
3.1.0 | 190 | 11/27/2024 |
3.0.4 | 119,953 | 3/19/2024 |
3.0.3 | 38,272 | 1/12/2024 |
3.0.3-beta | 488 | 12/13/2023 |
3.0.2.500 | 12,661 | 12/12/2023 |
3.0.2.327-beta | 1,564 | 10/13/2023 |
3.0.1.352 | 96,586 | 6/9/2023 |
3.0.0.351 | 28,708 | 5/6/2023 |
3.0.0.277-beta | 11,253 | 3/3/2022 |
3.0.0.270-beta | 747 | 2/27/2022 |
3.0.0.269-beta | 755 | 2/27/2022 |
3.0.0.268-beta | 741 | 2/24/2022 |
2.8.0 | 568,967 | 2/4/2022 |
2.7.2 | 269,832 | 4/8/2021 |
2.7.1 | 110,588 | 12/29/2020 |
2.7.0 | 334,680 | 2/11/2020 |
2.6.0 | 218,791 | 8/19/2019 |
2.5.0 | 173,421 | 3/12/2019 |
2.4.0 | 120,932 | 10/2/2018 |
2.3.1 | 94,419 | 6/12/2018 |
2.3.0 | 2,373 | 6/9/2018 |
2.2.0 | 93,402 | 2/10/2018 |
2.1.1 | 29,457 | 1/5/2018 |
2.1.0 | 12,504 | 12/10/2017 |
2.0.0 | 64,915 | 6/27/2017 |
2.0.0-alpha-44 | 2,569 | 5/10/2017 |
1.3.1 | 238,810 | 7/28/2014 |
1.2.0 | 9,341 | 6/16/2014 |
1.1.0 | 5,444 | 2/14/2014 |
1.0.0 | 8,549 | 12/31/2013 |
0.11.0 | 2,436 | 11/26/2013 |
0.9.0 | 2,490 | 8/6/2013 |
0.8.0 | 2,342 | 7/6/2013 |
0.7.0 | 2,174 | 6/4/2013 |
0.6.0 | 2,137 | 5/19/2013 |
0.5.0 | 2,165 | 4/21/2013 |
# V 3.0.2
## Fix
* Fix `FormatException` for some failure conditions with `Verifies` (issue #340)
# V 3.0.1
## Fix
* Fix `Check.ThatCode` not awaiting `Task` returning lambdas in V3.0.0. Note that `Task<T>` returning lambdas do work in V3.0.0
* an InvalidOperation is thrown when using `Check.ThatCode` on an async void method/lambda (as those cannot be awaited)
# V 3.0.0
## Major changes
* You can execute multiple check as a single batch and get every failures, instead of the first one. This can be achieved using:
* `Check.StartBatch`: stores the result of each subsequent check(s) and notifies all the errors when the returned object is disposed. Such as
`using(Check.StartBatch())
{
Check.That(sut).....
Check.That(sut)....
}`
Note that any actual exception thrown during the check phase will prevent any subsequent check from behind executed (1) and may not be reported as it may be replaced by an assertion failure exception.
This comes from C# exeption handling logic.
* You can provide anonymous types and tuples when using IsEqualTo against any type. The check will be made against all
_sut_'s propertie.
* NFluent supports Net 3.5 SP1, Net. 4.5.2 +, Net Standard 2.0+. Dropped support for Net Framework 2.0, 3.0, and 4.0, as well Net Standard<2.0.
If you can't upgrade your framework version to a supported one, please use NFluent 2.7.1.
## New Checks
* `Is`: Checks if _sut == expected_. This is a strongly typed equivalent to `IsEqualTo`.
* `IsGreaterOrEqualThan`: Checks if _sut_ >= _expected_.
* `IsLessOrEqualThan`: Checks if _sut_ <= _expected_.
## New feautres
* You can provide custom comparer for any type, using `Check.RegisterComparer` like this `Check.Register<MyType>(MyCustomComparer)`.
You can also use `RegisterLocalComparer` to limit its usage to a declaration scope.
## Breaking changes
* Equality logic changed for `IDictionary`: dictionaries are considered equals if they have the same keys and
the same values for each key. In NFluent V2, entries needed to be declared in the some order or else they were considered as **different** but **equivalent**.
* You need to specify
* `IsAnInstanceOf<nullableType>(null)` now fails (with an appropriate message). Previously, it did succeed. But,
as captured in issue #68, this behavior was triggered by a bug and kept due to a poor error message when fixed.
* The `IStructCheck<T>` interface has been removed as well as associated extensibility helper. Those were dedicated
to value `types`, you can migrate your existing extensions to the `ICheck<T>` type instead. Please open an issue if
you need help.
## Fixes
* HasFieldWithSameValues resulted in false positive when string fields had the same value.
* IsNotEqualTo now properly preserves expected type
* Improved rerporting of differences for enumerations and dictionaries to make them more consistent and fixed some inaccuracies.
## GitHub Issues
* #325, #327, #330, #332
### Obsolete
#### Marked as obsolet
* `ThatAsyncCode`: you can now use `ThatCode` even for async methods.
Here is the list of methods, classes and other obsolete stuff that have been removed in this version as well
as workaround advices.
* Drop support for Net 2.0 and 3.0: keep using NFluent V2.x versions if you support for these.
* `Check.ThatEnum`has been removed. You must use `Check.That` instead.
* `ILambdaCheck`: the definition was kept to prevent breaking build, but it was no longer used. If this is a
problem for you, open an issue
* `IsPositive` (available for numbers): please use `IsStrictlyPositive` instead.
* `IsNegative` (available for numbers): please use `IsStrictlyNegative` instead.
* `IsLessThan` (available for numbers): please use `IsStrictlyNegative` instead.
* `IsGreaterThan` (available for numbers): please use `IsStrictlyGreaterThan` instead.
* `IsSameReferenceThan`: please use `IsSameReferenceAs` instead.
* `HasFieldsEqualToThose`: please use `HasFieldsWithSameValues` instead.
* `HasFieldsNotEqualToThose`: please use `HasNotFieldsWithSameValues` instead.
* `IsAFaillingCheckWithMessage`: please use `IsAFailingCheckWithMessage` instead.
* `IsAFaillingCheck`: please use `IsAFailingCheck` instead.
* `Properties` (available for enumeration): please use `Extracting` instead.
* `Checker.BuildLinkWhich` (used for custom extension): please use `ExtensibilityHelper.BuildCheckLinkWhich` instead.
* `Checker.ExecuteCheckAndProvideSubItem` (used for custom extension): please 'ExtensibilityHelper' static class methods instead.