NFluent is an ergonomic assertion library which aims to fluent your .Net TDD experience (based on simple Check.That() check statements). NFluent aims your tests to be fluent to write (with an happy 'dot' auto completion experience), fluent to read (i.e. as close as possible to plain English expression), but also fluent to troubleshoot.
$ dotnet add package NFluent

Chat
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:
NFluent is directly inspired by the awesome Java FEST Fluent check/reflection library and it most famous fork AssertJ library.
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.
With Nfluent check libraries:
Check.That, 'cause every check is then provided via a super-duper-auto-completion-dot-experience ;-)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);
<subjectUnderTest>.Should().... why don't they choose Must instead?!?). And thus, you'd rather rely on a stronger semantic for your checks (i.e. NFluent's Check.That).


Can't be more easy: NFluent is available on nuget.org

NFluent use cases are available here.
For any comment, remark or question about the library, please use the NFluent-Discuss google group.
Nfluent backlog is now available as github issues
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