General tips
- If your assertion ends with
Should().BeTrue()
, there is most likely a better way to write it.
- By having
Should()
as early as possible in the assertion, we are able to include more information in the failure messages.
Improved assertions
The examples below show how you might improve your existing assertions to both get more readable assertions and much more informative failure messages.
If you see something missing, please consider submitting a pull request.
Collections
Assertion
|
Improvement
|
actual.Any().Should().BeTrue();
|
actual.Should().NotBeEmpty();
|
Expected True, but found False.
|
Expected collection not to be empty.
|
Assertion
|
Improvement
|
actual.Any().Should().BeFalse();
|
actual.Should().BeEmpty();
|
Expected False, but found True.
|
Expected collection to be empty, but found {SomeProperty: 0, OtherProperty: }.
|
Assertion
|
Improvement
|
actual.Any(x => x.SomeProperty).Should().BeTrue();
|
actual.Should().Contain(x => x.SomeProperty);
|
Expected True, but found False.
|
Collection {SomeProperty: 0, OtherProperty: Actual} should have an item matching (x.OtherProperty == value(UnitTests2.CollectionTests+<>c__DisplayClass5_0).expectedValue).
|
Assertion
|
Improvement
|
actual.Any(x => x.SomeProperty).Should().BeFalse();
|
actual.Should().NotContain(x => x.SomeProperty);
|
Expected False, but found True.
|
Expected Collection {SomeProperty: 0, OtherProperty: Unexpected} to not have any items matching (x.OtherProperty == value(UnitTests2.CollectionTests+<>c__DisplayClass7_0).unexpectedValue).
|
Assertion
|
Improvement
|
actual.All(x => x.SomeProperty).Should().BeTrue();
|
// now fails on empty collection;
actual.Should().OnlyContain(x => x.SomeProperty)
|
Expected True, but found False.
|
Expected collection to contain only items matching (x.OtherProperty == value(UnitTests2.CollectionTests+<>c__DisplayClass9_0).expectedValue), but {SomeProperty: 0, OtherProperty: Actual} do(es) not match.
|
Assertion
|
Improvement
|
actual.Contains(expected).Should().BeTrue();
|
actual.Should().Contain(expected);
|
Expected True, but found False.
|
Expected collection {"Actual"} to contain "Expected".
|
Assertion
|
Improvement
|
actual.Contains(unexpected).Should().BeFalse();
|
actual.Should().NotContain(unexpected);
|
Expected False, but found True.
|
Expected collection {"Expected"} to not contain "Expected".
|
Assertion
|
Improvement
|
actual.Any(x => x == unexpected).Should().BeFalse();
|
actual.Should().NotContain(unexpected);
|
Expected False, but found True.
|
Expected collection {"Unexpected"} to not contain "Unexpected".
|
Assertion
|
Improvement
|
actual.Count().Should().Be(k);
|
actual.Should().HaveCount(k);
|
Expected value to be 2, but found 3.
|
Expected collection to contain 2 item(s), but found 3.
|
Assertion
|
Improvement
|
actual.Count().Should().BeGreaterThan(k);
|
actual.Should().HaveCountGreaterThan(k);
|
Expected a value greater than 4, but found 3.
|
Expected collection to contain more than 4 item(s), but found 3.
|
Assertion
|
Improvement
|
actual.Count().Should().BeGreaterOrEqualTo(k);
|
actual.Should().HaveCountGreaterOrEqualTo(k);
|
Expected a value greater or equal to 4, but found 3.
|
Expected collection to contain at least 4 item(s), but found 3.
|
Assertion
|
Improvement
|
actual.Count().Should().BeLessThan(k);
|
actual.Should().HaveCountLessThan(k);
|
Expected a value less than 2, but found 3.
|
Expected collection to contain fewer than 2 item(s), but found 3.
|
Assertion
|
Improvement
|
actual.Count().Should().BeLessOrEqualTo(k);
|
actual.Should().HaveCountLessOrEqualTo(k);
|
Expected a value less or equal to 2, but found 3.
|
Expected collection to contain at most 2 item(s), but found 3.
|
Assertion
|
Improvement
|
actual.Count().Should().NotBe(k);
|
actual.Should().NotHaveCount(k);
|
|
Expected collection to not contain 3 item(s), but found 3.
|
Assertion
|
Improvement
|
actual.Should().HaveCount(1);
|
actual.Should().ContainSingle();
|
Expected collection to contain 1 item(s), but found 3.
|
Expected collection to contain a single item, but found {"", "", ""}.
|
Assertion
|
Improvement
|
actual.Should().HaveCount(0);
|
actual.Should().BeEmpty();
|
Expected collection to contain 0 item(s), but found 3.
|
Expected collection to be empty, but found {"", "", ""}.
|
Assertion
|
Improvement
|
actual.Should().HaveCount(expected.Count());
|
actual.Should().HaveSameCount(expected);
|
Expected collection to contain 2 item(s), but found 3.
|
Expected collection to have 2 item(s), but found 3.
|
Assertion
|
Improvement
|
actual.Count().Should().NotBe(unexpected.Count());
|
actual.Should().NotHaveSameCount(unexpected);
|
|
Expected collection to not have 2 item(s), but found 2.
|
Assertion
|
Improvement
|
actual.Where(x => x.SomeProperty).Should().NotBeEmpty();
|
actual.Should().Contain(x => x.SomeProperty);
|
Expected collection not to be empty.
|
Collection {SomeProperty: 0, OtherProperty: Actual} should have an item matching (x.OtherProperty == value(UnitTests2.CollectionTests+<>c__DisplayClass39_0).expectedValue).
|
Assertion
|
Improvement
|
actual.Where(x => x.SomeProperty).Should().BeEmpty();
|
actual.Should().NotContain(x => x.SomeProperty);
|
Expected collection to be empty, but found {SomeProperty: 0, OtherProperty: Expected}.
|
Expected Collection {SomeProperty: 0, OtherProperty: Expected} to not have any items matching (x.OtherProperty == value(UnitTests2.CollectionTests+<>c__DisplayClass41_0).expectedValue).
|
Assertion
|
Improvement
|
actual.Where(x => x.SomeProperty).Should().HaveCount(1);
|
actual.Should().ContainSingle(x => x.SomeProperty);
|
Expected collection to contain 1 item(s), but found 0.
|
Expected collection to contain a single item matching (x.OtherProperty == value(UnitTests2.CollectionTests+<>c__DisplayClass43_0).expectedValue), but no such item was found.
|
Assertion
|
Improvement
|
actual.Should().OnlyContain(e => !e.SomeProperty);
|
actual.Should().NotContain(x => x.SomeProperty);
|
Expected collection to contain only items matching (x.OtherProperty != value(UnitTests2.CollectionTests+<>c__DisplayClass44_0).unexpectedValue), but {SomeProperty: 0, OtherProperty: Unexpected} do(es) not match.
|
Expected Collection {SomeProperty: 0, OtherProperty: Unexpected} to not have any items matching (x.OtherProperty == value(UnitTests2.CollectionTests+<>c__DisplayClass45_0).unexpectedValue).
|
Assertion
|
Improvement
|
actual.Should().NotBeNull().And.NotBeEmpty();
|
actual.Should().NotBeNullOrEmpty();
|
Expected collection not to be empty.
|
Expected collection not to be empty.
|
Assertion
|
Improvement
|
actual.ElementAt(k).Should().Be(expected);
|
actual.Should().HaveElementAt(k, expected);
|
Expected string to be
"Expected" with a length of 8, but
"Unexpected" has a length of 10.
|
Expected "Expected" at index 0, but found "Unexpected".
|
Assertion
|
Improvement
|
actual[k].Should().Be(expected);
|
actual.Should().HaveElementAt(k, expected);
|
Expected string to be
"Expected" with a length of 8, but
"Unexpected" has a length of 10.
|
Expected "Expected" at index 0, but found "Unexpected".
|
Assertion
|
Improvement
|
actual.Skip(k).First().Should().Be(expected);
|
actual.Should().HaveElementAt(k, expected);
|
Expected string to be
"Expected" with a length of 8, but
"Unexpected" has a length of 10.
|
Expected "Expected" at index 1, but found "Unexpected".
|
Assertion
|
Improvement
|
actual.OrderBy(x => x.SomeProperty)
.Should().Equal(actual);
|
actual.Should().BeInAscendingOrder(x => x.SomeProperty);
|
Expected collection to be equal to {SomeProperty: 2, OtherProperty: , SomeProperty: 1, OtherProperty: }, but {SomeProperty: 1, OtherProperty: , SomeProperty: 2, OtherProperty: } differs at index 0.
|
Expected collection {SomeProperty: 2, OtherProperty: , SomeProperty: 1, OtherProperty: } to be ordered" by SomeProperty" and result in {SomeProperty: 1, OtherProperty: , SomeProperty: 2, OtherProperty: }.
|
Assertion
|
Improvement
|
actual.OrderByDescending(x => x.SomeProperty)
.Should().Equal(actual);
|
actual.Should().BeInDescendingOrder(x => x.SomeProperty);
|
Expected collection to be equal to {SomeProperty: 1, OtherProperty: , SomeProperty: 2, OtherProperty: }, but {SomeProperty: 2, OtherProperty: , SomeProperty: 1, OtherProperty: } differs at index 0.
|
Expected collection {SomeProperty: 1, OtherProperty: , SomeProperty: 2, OtherProperty: } to be ordered" by SomeProperty" and result in {SomeProperty: 2, OtherProperty: , SomeProperty: 1, OtherProperty: }.
|
Assertion
|
Improvement
|
actual.Select(e1 => e1.SomeProperty).Should()
.Equal(expected.Select(e2 => e2.SomeProperty));
|
actual.Should()
.Equal(expected,
(e1, e2) => e1.SomeProperty == e2.SomeProperty);
|
Expected collection to be equal to {"Expected", "Expected"}, but {"Actual", "Actual"} differs at index 0.
|
Expected collection to be equal to {SomeProperty: 1, OtherProperty: Expected, SomeProperty: 2, OtherProperty: Expected}, but {SomeProperty: 1, OtherProperty: Actual, SomeProperty: 2, OtherProperty: Actual} differs at index 0.
|
Assertion
|
Improvement
|
actual.Intersect(expected).Should().BeEmpty();
|
actual.Should().NotIntersectWith(expected);
|
Expected collection to be empty, but found {SomeProperty: 1, OtherProperty: Expected}.
|
Did not expect collection to intersect with {SomeProperty: 1, OtherProperty: Expected}, but found the following shared items {SomeProperty: 1, OtherProperty: Expected}.
|
Assertion
|
Improvement
|
actual.Intersect(expected).Should().NotBeEmpty();
|
actual.Should().IntersectWith(expected);
|
Expected collection not to be empty.
|
Expected collection to intersect with {SomeProperty: 1, OtherProperty: Expected}, but {SomeProperty: 1, OtherProperty: Actual} does not contain any shared items.
|
Assertion
|
Improvement
|
actual.Select(x => x.SomeProperty)
.Should().NotContainNulls();
|
actual.Should().NotContainNulls(e => e.OtherProperty);
|
Expected collection not to contain nulls, but found one at index 0.
|
Expected collection not to contain <null>s on e.OtherProperty, but found {SomeProperty: 1, OtherProperty: }.
|
Assertion
|
Improvement
|
actual.Should().HaveSameCount(actual.Distinct());
|
actual.Should().OnlyHaveUniqueItems();
|
Expected collection to have 1 item(s), but found 2.
|
Expected collection to only have unique items, but item SomeProperty: 1, OtherProperty: is not unique.
|
Assertion
|
Improvement
|
actual.Select(x => x.SomeProperty)
.Should().OnlyHaveUniqueItems();
|
actual.Should().OnlyHaveUniqueItems(x => x.SomeProperty);
|
Expected collection to only have unique items, but item 1 is not unique.
|
Expected collection to only have unique items on x.SomeProperty, but item SomeProperty: 1, OtherProperty: is not unique.
|
Assertion
|
Improvement
|
// From the assertion it is unclear what is being tested.
actual.FirstOrDefault().Should().BeNull();
|
// The first element is null.
actual.Should().HaveElementAt(0, null);
|
Expected string to be <null>, but found "".
|
Expected <null> at index 0, but found "".
|
Comparable and Numerics
Assertion
|
Improvement
|
actual.Should().BeGreaterThan(0);
|
actual.Should().BePositive();
|
Expected a value greater than 0, but found -1.
|
Expected positive value, but found -1
|
Assertion
|
Improvement
|
actual.Should().BeLessThan(0);
|
actual.Should().BeNegative();
|
Expected a value less than 0, but found 1.
|
Expected negative value, but found 1
|
Assertion
|
Improvement
|
(lower <= actual && actual <= upper).Should().BeTrue();
|
actual.Should().BeInRange(lower, upper);
|
Expected True, but found False.
|
Expected value to be between 1 and 5, but found 6.
|
Assertion
|
Improvement
|
(lower <= actual && actual <= upper).Should().BeFalse();
|
actual.Should().NotBeInRange(lower, upper);
|
Expected False, but found True.
|
Expected value to not be between 1 and 5, but found 4.
|
DateTimes
Assertion
|
Improvement
|
actual.Date.Should().Be(expected.Date);
|
actual.Should().BeSameDateAs(expected);
|
Expected date and time to be <2017-01-01>, but found <2017-01-02>.
|
Expected a date and time with date <2017-01-01>, but found <2017-01-02 21:00:00>.
|
Assertion
|
Improvement
|
actual.Date.Should().NotBe(unexpected.Date);
|
actual.Should().NotBeSameDateAs(unexpected);
|
Expected date and time not to be <2017-01-01>, but it is.
|
Expected a date and time that does not have date <2017-01-01>, but found it does.
|
Assertion
|
Improvement
|
actual.Year.Should().Be(expected.Year);
|
actual.Should().HaveYear(expected.Year);
|
Expected actual.Year to be 2018, but found 2017 (difference of -1).
|
Expected the year part of actual to be 2018, but found 2017.
|
Assertion
|
Improvement
|
actual.Year.Should().NotBe(unexpected.Year);
|
actual.Should().NotHaveYear(unexpected.Year);
|
Did not expect the year part of actual to be 2017, but it was.
|
Did not expect actual.Year to be 2017.
|
Assertion
|
Improvement
|
actual.Month.Should().Be(expected.Month);
|
actual.Should().HaveMonth(expected.Month);
|
Expected actual.Month to be 2, but found 1.
|
Expected the month part of actual to be 2, but found 1.
|
Assertion
|
Improvement
|
actual.Month.Should().NotBe(unexpected.Month);
|
actual.Should().NotHaveMonth(unexpected.Month);
|
Did not expect actual.Month to be 1.
|
Did not expect the month part of actual to be 1, but it was.
|
Assertion
|
Improvement
|
actual.Day.Should().Be(expected.Day);
|
actual.Should().HaveDay(expected.Day);
|
Expected actual.Day to be 2, but found 1.
|
Expected the day part of actual to be 2, but found 1.
|
Assertion
|
Improvement
|
actual.Day.Should().NotBe(unexpected.Day);
|
actual.Should().NotHaveDay(unexpected.Day);
|
Did not expect actual.Day to be 1.
|
Did not expect the day part of actual to be 1, but it was.
|
Assertion
|
Improvement
|
actual.Hour.Should().Be(expected.Hour);
|
actual.Should().HaveHour(expected.Hour);
|
Expected actual.Hour to be 19, but found 16 (difference of -3).
|
Expected the hour part of actual to be 19, but found 16.
|
Assertion
|
Improvement
|
actual.Hour.Should().NotBe(unexpected.Hour);
|
actual.Should().NotHaveHour(unexpected.Hour);
|
Did not expect actual.Hour to be 16.
|
Did not expect the hour part of actual to be 16, but it was.
|
Assertion
|
Improvement
|
actual.Minute.Should().Be(expected.Minute);
|
actual.Should().HaveMinute(expected.Minute);
|
Expected actual.Minute to be 31, but found 30 (difference of -1).
|
Expected the minute part of actual to be 31, but found 30.
|
Assertion
|
Improvement
|
actual.Minute.Should().NotBe(unexpected.Minute);
|
actual.Should().NotHaveMinute(unexpected.Minute);
|
Did not expect actual.Minute to be 30.
|
Did not expect the minute part of actual to be 30, but it was.
|
Assertion
|
Improvement
|
actual.Second.Should().Be(expected.Second);
|
actual.Should().HaveSecond(expected.Second);
|
Expected actual.Second to be 18, but found 17 (difference of -1).
|
Expected the seconds part of actual to be 18, but found 17.
|
Assertion
|
Improvement
|
actual.Second.Should().NotBe(unexpected.Second);
|
actual.Should().NotHaveSecond(unexpected.Second);
|
Did not expect actual.Second to be 17.
|
Did not expect the seconds part of actual to be 17, but it was.
|
Dictionaries
Assertion
|
Improvement
|
actual.ContainsKey(expected).Should().BeTrue();
|
actual.Should().ContainKey(expected);
|
Expected True, but found False.
|
Expected dictionary {[0, ]} to contain key 1.
|
Assertion
|
Improvement
|
actual.ContainsKey(expected).Should().BeFalse();
|
actual.Should().NotContainKey(expected);
|
Expected False, but found True.
|
Dictionary {[0, ]} should not contain key 0, but found it anyhow.
|
Assertion
|
Improvement
|
actual.ContainsValue(expected).Should().BeTrue();
|
actual.Should().ContainValue(expected);
|
Expected True, but found False.
|
Expected dictionary {[0, ]} to contain value "expected".
|
Assertion
|
Improvement
|
actual.ContainsValue(expected).Should().BeFalse();
|
actual.Should().NotContainValue(expected);
|
Expected False, but found True.
|
Dictionary {[0, expected]} should not contain value "expected", but found it anyhow.
|
Assertion
|
Improvement
|
actual.Should().ContainKey(expectedKey)
.And.ContainValue(expectedValue);
|
actual.Should().Contain(expectedKey, expectedValue);
|
Expected dictionary {[0, ]} to contain value "expected".
|
Expected dictionary to contain value "expected" at key 0, but found "".
|
Assertion
|
Improvement
|
actual.Should().ContainKey(expected.Key)
.And.ContainValue(expected.Value);
|
actual.Should().Contain(expected);
|
Expected dictionary {[0, ]} to contain value "expected".
|
Expected dictionary to contain value "expected" at key 0, but found "".
|
Exceptions
Assertion
|
Improvement
|
Action act = () => throw new InvalidOperationException("Problems, errorCode2 and more Problems");
act.Should().ThrowExactly<InvalidOperationException>()
.Which.Message.Should().Contain("errorCode1");
|
Action act = () => throw new InvalidOperationException("Problems, errorCode2 and more Problems");
// using wildcards
act.Should().ThrowExactly<InvalidOperationException>()
.WithMessage("*errorCode1*");
|
Expected string "Problems, errorCode2 and more Problems" to contain "errorCode1".
|
Expected exception message to match the equivalent of
"*errorCode1*", but
"Problems, errorCode2 and more Problems" does not.
|
Assertion
|
Improvement
|
Action act = () => throw new InvalidOperationException("Problems, errorCode2 and more Problems");
act.Should().Throw<Exception>()
.Which.Message.Should().Contain("errorCode1");
|
Action act = () => throw new InvalidOperationException("Problems, errorCode2 and more Problems");
// using wildcards
act.Should().Throw<Exception>()
.WithMessage("*errorCode1*");
|
Expected string "Problems, errorCode2 and more Problems" to contain "errorCode1".
|
Expected exception message to match the equivalent of
"*errorCode1*", but
"Problems, errorCode2 and more Problems" does not.
|
Assertion
|
Improvement
|
Action act = () => throw new Exception("Problems, errorCode2 and more Problems", new InvalidOperationException());
act.Should().Throw<Exception>()
.Which.InnerException.Should().BeAssignableTo<ArgumentException>();
|
Action act = () => throw new Exception("Problems, errorCode2 and more Problems", new InvalidOperationException());
act.Should().Throw<Exception>()
.WithInnerException<ArgumentException>();
|
Expected action to be assignable to System.ArgumentException, but System.InvalidOperationException is not.
|
Expected inner System.ArgumentException, but found System.InvalidOperationException with message "Operation is not valid due to the current state of the object."
|
Assertion
|
Improvement
|
Action act = () => throw new Exception("Problems, errorCode2 and more Problems", new ArgumentNullException());
act.Should().Throw<Exception>()
.Which.InnerException.Should().BeOfType<ArgumentException>();
|
Action act = () => throw new Exception("Problems, errorCode2 and more Problems", new ArgumentNullException());
act.Should().Throw<Exception>()
.WithInnerExceptionExactly<ArgumentException>();
|
Expected type to be System.ArgumentException, but found System.ArgumentNullException.
|
Expected inner System.ArgumentException, but found System.ArgumentNullException with message "Value cannot be null."
|
Nullables
Assertion
|
Improvement
|
actual.HasValue.Should().BeTrue();
|
actual.Should().HaveValue();
|
Expected True, but found False.
|
|
Assertion
|
Improvement
|
actual.HasValue.Should().BeFalse();
|
actual.Should().NotHaveValue();
|
Expected False, but found True.
|
Did not expect a value, but found 1.
|
Strings
Assertion
|
Improvement
|
actual.StartsWith(expectedPrefix).Should().BeTrue();
|
actual.Should().StartWith(expectedPrefix);
|
Expected True, but found False.
|
Expected string to start with
"Expected", but
"ActualString" differs near "Act" (index 0).
|
Assertion
|
Improvement
|
actual.EndsWith(expectedSuffix).Should().BeTrue();
|
actual.Should().EndWith(expectedSuffix);
|
Expected True, but found False.
|
Expected string "ActualString" to end with "Expected".
|
Assertion
|
Improvement
|
actual.Should().NotBeNull().And.NotBeEmpty();
|
actual.Should().NotBeNullOrEmpty();
|
Did not expect empty string.
|
Expected string not to be <null> or empty, but found "".
|
Assertion
|
Improvement
|
string.IsNullOrEmpty(actual).Should().BeTrue();
|
actual.Should().BeNullOrEmpty();
|
Expected True, but found False.
|
Expected string to be <null> or empty, but found "Actual".
|
Assertion
|
Improvement
|
string.IsNullOrEmpty(actual).Should().BeFalse();
|
actual.Should().NotBeNullOrEmpty();
|
Expected False, but found True.
|
Expected string not to be <null> or empty, but found "".
|
Assertion
|
Improvement
|
string.IsNullOrWhiteSpace(actual).Should().BeTrue();
|
actual.Should().BeNullOrWhiteSpace();
|
Expected True, but found False.
|
Expected string to be <null> or whitespace, but found "Actual".
|
Assertion
|
Improvement
|
string.IsNullOrWhiteSpace(actual).Should().BeFalse();
|
actual.Should().NotBeNullOrWhiteSpace();
|
Expected False, but found True.
|
Expected string not to be <null> or whitespace, but found " ".
|
Assertion
|
Improvement
|
actual.Length.Should().Be(k);
|
actual.Should().HaveLength(k);
|
Expected value to be 4, but found 6.
|
Expected string with length 4, but found string "Actual" with length 6.
|
Types
Assertion
|
Improvement
|
actual.GetType().Should().Be(typeof(T));
|
actual.Should().BeOfType<T>();
|
Expected type to be UnitTests2.MyClass, but found UnitTests2.MyIdenticalClass.
|
Expected type to be UnitTests2.MyClass, but found UnitTests2.MyIdenticalClass.
|
Assertion
|
Improvement
|
actual.GetType().Should().NotBe(typeof(T));
|
actual.Should().NotBeOfType<T>();
|
Expected type not to be [UnitTests2.MyClass, UnitTests2, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null], but it is.
|
Expected type not to be [UnitTests2.MyClass, UnitTests2, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null], but it is.
|
Assertion
|
Improvement
|
(actual is T).Should().BeTrue();
|
actual.Should().BeAssignableTo<T>();
|
Expected True, but found False.
|
Expected object to be assignable to UnitTests2.MyClass, but UnitTests2.MyIdenticalClass is not.
|
Assertion
|
Improvement
|
(actual as T).Should().NotBeNull();
|
actual.Should().BeAssignableTo<T>();
|
Expected object not to be <null>.
|
Expected object to be assignable to UnitTests2.MyClass, but UnitTests2.MyIdenticalClass is not.
|
Assertion
|
Improvement
|
(actual is T).Should().BeFalse();
|
actual.Should().NotBeAssignableTo<T>();
|
Expected False, but found True.
|
Expected object to not be assignable to UnitTests2.MyClass, but UnitTests2.MyClass is.
|
Assertion
|
Improvement
|
(actual as T).Should().BeNull();
|
actual.Should().NotBeAssignableTo<T>();
|
Expected object to be <null>, but found SomeProperty: 1, OtherProperty: actual.
|
Expected object to not be assignable to UnitTests2.MyClass, but UnitTests2.MyClass is.
|
MSTest Migration
The examples below show how you might write equivalent MSTest assertions using Fluent Assertions including the failure message from each case.
We think this is both a useful migration guide and a convincing argument for switching.
If you see something missing, please consider submitting a pull request.
Assert
MSTest
|
Fluent Assertions
|
|
actual.Should().BeTrue();
|
|
Expected True, but found False.
|
MSTest
|
Fluent Assertions
|
|
actual.Should().BeFalse();
|
|
Expected False, but found True.
|
MSTest
|
Fluent Assertions
|
|
actual.Should().BeNull();
|
|
Expected object to be <null>, but found System.Object (HashCode=51904525).
|
MSTest
|
Fluent Assertions
|
Assert.IsNotNull(actual);
|
actual.Should().NotBeNull();
|
|
Expected object not to be <null>.
|
MSTest
|
Fluent Assertions
|
Assert.AreEqual(expected, actual);
|
actual.Should().Be(expected);
|
Assert.AreEqual failed. Expected:<SomeProperty: 2, OtherProperty: expected>. Actual:<SomeProperty: 1, OtherProperty: actual>.
|
Expected object to be SomeProperty: 2, OtherProperty: expected, but found SomeProperty: 1, OtherProperty: actual.
|
MSTest
|
Fluent Assertions
|
Assert.AreEqual(expected, actual, delta);
|
actual.Should().BeApproximately(expected, delta);
|
Assert.AreEqual failed. Expected a difference no greater than <0.5> between expected value <2> and actual value <1.25>.
|
Expected value 1.25 to approximate 2.0 +/- 0.5, but it differed by 0.75.
|
MSTest
|
Fluent Assertions
|
Assert.AreNotEqual(expected, actual);
|
actual.Should().NotBe(expected);
|
Assert.AreNotEqual failed. Expected any value except:<SomeProperty: 1, OtherProperty: expected>. Actual:<SomeProperty: 1, OtherProperty: expected>.
|
Did not expect object to be equal to SomeProperty: 1, OtherProperty: expected.
|
MSTest
|
Fluent Assertions
|
Assert.AreNotEqual(expected, actual, delta);
|
actual.Should().NotBeApproximately(expected, delta);
|
Assert.AreNotEqual failed. Expected a difference greater than <0.5> between expected value <2> and actual value <2>.
|
Expected value 2.0 to not approximate 2.0 +/- 0.5, but it only differed by 0.0.
|
MSTest
|
Fluent Assertions
|
Assert.AreSame(expected, actual);
|
actual.Should().BeSameAs(expected);
|
|
Expected object to refer to
SomeProperty: 1, OtherProperty: actual, but found
SomeProperty: 1, OtherProperty: actual.
|
MSTest
|
Fluent Assertions
|
Assert.AreNotSame(expected, actual);
|
actual.Should().NotBeSameAs(expected);
|
Assert.AreNotSame failed.
|
Did not expect reference to object SomeProperty: 1, OtherProperty: actual.
|
MSTest
|
Fluent Assertions
|
Assert.IsInstanceOfType(actual, typeof(T));
|
actual.Should().BeOfType<T>();
|
Assert.IsInstanceOfType failed. Expected type:<UnitTests2.MyIdenticalClass>. Actual type:<UnitTests2.MyClass>.
|
Expected type to be UnitTests2.MyIdenticalClass, but found UnitTests2.MyClass.
|
MSTest
|
Fluent Assertions
|
Assert.IsNotInstanceOfType(actual, typeof(T));
|
actual.Should().NotBeOfType<T>();
|
Assert.IsNotInstanceOfType failed. Wrong Type:<UnitTests2.MyClass>. Actual type:<UnitTests2.MyClass>.
|
Expected type not to be [UnitTests2.MyClass, UnitTests2, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null], but it is.
|
MSTest
|
Fluent Assertions
|
Assert.IsTrue(actual == expected);
|
// refer to the exact same object in memory
actual.Should().BeSameAs(expected);
|
|
Expected object to refer to
SomeProperty: 2, OtherProperty: expected, but found
SomeProperty: 1, OtherProperty: actual.
|
MSTest
|
Fluent Assertions
|
Assert.IsFalse(actual == expected);
|
// refer to the different object in memory
actual.Should().NotBeSameAs(expected);
|
|
Did not expect reference to object
SomeProperty: 1, OtherProperty: expected.
|
MSTest
|
Fluent Assertions
|
Assert.IsTrue(actual != expected);
|
// refer to the different object in memory
actual.Should().NotBeSameAs(expected);
|
|
Did not expect reference to object
SomeProperty: 1, OtherProperty: expected.
|
MSTest
|
Fluent Assertions
|
Assert.IsFalse(actual != expected);
|
// refer to the exact same object in memory
actual.Should().BeSameAs(expected)
|
|
Expected object to refer to
SomeProperty: 2, OtherProperty: expected, but found
SomeProperty: 1, OtherProperty: actual.
|
MSTest
|
Fluent Assertions
|
Assert.IsTrue(actual > expected);
|
actual.Should().BeGreaterThan(expected);
|
|
Expected a value greater than 2, but found 1.
|
MSTest
|
Fluent Assertions
|
Assert.IsFalse(actual > expected);
|
actual.Should().BeLessOrEqualTo(expected);
|
|
Expected a value less or equal to 1, but found 2.
|
MSTest
|
Fluent Assertions
|
Assert.IsTrue(actual >= expected);
|
actual.Should().BeGreaterOrEqualTo(expected);
|
|
Expected a value greater or equal to 2, but found 1.
|
MSTest
|
Fluent Assertions
|
Assert.IsFalse(actual >= expected);
|
actual.Should().BeLessThan(expected);
|
|
Expected a value less than 1, but found 2.
|
MSTest
|
Fluent Assertions
|
Assert.IsTrue(actual < expected);
|
actual.Should().BeLessThan(expected);
|
|
Expected a value less than 1, but found 2.
|
MSTest
|
Fluent Assertions
|
Assert.IsFalse(actual < expected);
|
actual.Should().BeGreaterOrEqualTo(expected);
|
|
Expected a value greater or equal to 2, but found 1.
|
MSTest
|
Fluent Assertions
|
Assert.IsTrue(actual <= expected);
|
actual.Should().BeLessOrEqualTo(expected);
|
|
Expected a value less or equal to 1, but found 2.
|
MSTest
|
Fluent Assertions
|
Assert.IsFalse(actual <= expected);
|
actual.Should().BeGreaterThan(expected);
|
|
Expected a value greater than 2, but found 1.
|
CollectionAssert
MSTest
|
Fluent Assertions
|
CollectionAssert.AllItemsAreUnique(actual);
|
actual.Should().OnlyHaveUniqueItems();
|
CollectionAssert.AllItemsAreUnique failed. Duplicate item found:<SomeProperty: 1, OtherProperty: item>.
|
Expected collection to only have unique items, but item SomeProperty: 1, OtherProperty: item is not unique.
|
MSTest
|
Fluent Assertions
|
CollectionAssert.AreEqual(expected, actual);
|
actual.Should().Equal(expected);
|
CollectionAssert.AreEqual failed. (Element at index 0 do not match.)
|
Expected collection to be equal to {SomeProperty: 1, OtherProperty: item}, but {SomeProperty: 1, OtherProperty: different} differs at index 0.
|
MSTest
|
Fluent Assertions
|
CollectionAssert.AreNotEqual(expected, actual);
|
actual.Should().NotEqual(expected);
|
CollectionAssert.AreNotEqual failed. (Both collection contain same elements.)
|
Did not expect collections {SomeProperty: 1, OtherProperty: item} and {SomeProperty: 1, OtherProperty: item} to be equal.
|
MSTest
|
Fluent Assertions
|
CollectionAssert.AreEquivalent(expected, actual);
|
actual.Should().BeEquivalentTo(expected);
|
CollectionAssert.AreEquivalent failed. The expected collection contains 1 occurrence(s) of <SomeProperty: 2, OtherProperty: other>. The actual collection contains 0 occurrence(s).
|
Expected collection {SomeProperty: 1, OtherProperty: item, SomeProperty: 2, OtherProperty: item} to be equivalent to {SomeProperty: 1, OtherProperty: item, SomeProperty: 2, OtherProperty: other}, but it misses {SomeProperty: 2, OtherProperty: other}.
|
MSTest
|
Fluent Assertions
|
CollectionAssert.AreNotEquivalent(expected, actual);
|
actual.Should().NotBeEquivalentTo(expected);
|
CollectionAssert.AreNotEquivalent failed. Both collections contain the same elements.
|
Expected collection {SomeProperty: 1, OtherProperty: item, SomeProperty: 2, OtherProperty: other} not be equivalent with collection {SomeProperty: 1, OtherProperty: item, SomeProperty: 2, OtherProperty: other}.
|
MSTest
|
Fluent Assertions
|
CollectionAssert.Contains(actual, expected);
|
actual.Should().Contain(expected);
|
CollectionAssert.Contains failed.
|
Expected collection {SomeProperty: 2, OtherProperty: other} to contain SomeProperty: 1, OtherProperty: item.
|
MSTest
|
Fluent Assertions
|
CollectionAssert.DoesNotContain(actual, expected);
|
actual.Should().NotContain(expected);
|
CollectionAssert.DoesNotContain failed.
|
Expected collection {SomeProperty: 1, OtherProperty: item} to not contain SomeProperty: 1, OtherProperty: item.
|
MSTest
|
Fluent Assertions
|
CollectionAssert.IsSubsetOf(actual, expectedSuperset);
|
actual.Should().BeSubsetOf(expectedSuperset);
|
CollectionAssert.IsSubsetOf failed.
|
Expected collection to be a subset of {SomeProperty: 1, OtherProperty: item}, but items {SomeProperty: 2, OtherProperty: other} are not part of the superset.
|
MSTest
|
Fluent Assertions
|
CollectionAssert.IsNotSubsetOf(actual, expectedSuperset);
|
actual.Should().NotBeSubsetOf(expectedSuperset);
|
CollectionAssert.IsNotSubsetOf failed.
|
Did not expect collection {SomeProperty: 1, OtherProperty: item} to be a subset of {SomeProperty: 1, OtherProperty: item}.
|
MSTest
|
Fluent Assertions
|
CollectionAssert.AllItemsAreNotNull(actual);
|
actual.Should().NotContainNulls();
|
CollectionAssert.AllItemsAreNotNull failed.
|
Expected collection not to contain nulls, but found one at index 0.
|
MSTest
|
Fluent Assertions
|
CollectionAssert.AllItemsAreInstancesOfType(actual, typeof(T));
|
actual.Should().AllBeAssignableTo<T>();
|
CollectionAssert.AllItemsAreInstancesOfType failed. Element at index 0 is not of expected type. Expected type:<UnitTests2.MyIdenticalClass>. Actual type:<UnitTests2.MyClass>.
|
Expected type to be "T", but found [System.String],
|
StringAssert
MSTest
|
Fluent Assertions
|
StringAssert.Contains(actual, expectedSubstring);
|
actual.Should().Contain(expectedSubstring);
|
StringAssert.Contains failed. String 'SomeLongString' does not contain string 'Short'. .
|
Expected string "SomeLongString" to contain "Short".
|
MSTest
|
Fluent Assertions
|
StringAssert.StartWith(actual, expectedPrefix);
|
actual.Should().StartWith(expectedPrefix);
|
StringAssert.StartsWith failed. String 'LongString' does not start with string 'Short'. .
|
Expected string to start with
"Short", but
"LongString" differs near "Lon" (index 0).
|
MSTest
|
Fluent Assertions
|
StringAssert.EndsWith(actual, expectedSuffix);
|
actual.Should().EndWith(expectedSuffix);
|
StringAssert.EndsWith failed. String 'StringLong' does not end with string 'Short'. .
|
Expected string "StringLong" to end with "Short".
|
MSTest
|
Fluent Assertions
|
StringAssert.Matches(actual, expectedPattern);
|
actual.Should().MatchRegex(expectedPattern);
|
StringAssert.Matches failed. String 'SomeLong' does not match pattern '.*String.*'. .
|
Expected string to match regex
".*String.*", but
"SomeLong" does not match.
|
MSTest
|
Fluent Assertions
|
StringAssert.DoesNotMatch(actual, expectedPattern);
|
actual.Should().NotMatchRegex(expectedPattern);
|
StringAssert.DoesNotMatch failed. String 'SomeStringLong' matches pattern '.*String.*'. .
|
Did not expect string to match regex
".*String.*", but
"SomeStringLong" matches.
|
Exceptions
MSTest
|
Fluent Assertions
|
[ExpectedException(typeof(InvalidOperationException))]
public void MyTest()
{
func();
}
|
public void MyTest()
{
Action act = () => func();
act.Should().ThrowExactly<InvalidOperationException>();
}
|
Test method threw exception System.InvalidCastException, but exception System.ArgumentNullException was expected. Exception System.InvalidCastException: Specified cast is not valid.
|
Expected a <System.ArgumentNullException> to be thrown, but found a <System.InvalidCastException>: System.InvalidCastException with message "Specified cast is not valid."
at UnitTests2.ExceptionTests.<>c.<Snippet01_New>b__1_0() in C:\Path\To\UnitTests\ExceptionTests.cs:line 31
at UnitTests2.ExceptionTests.<>c__DisplayClass1_0.<Snippet01_New>b__1() in C:\Path\To\UnitTests\ExceptionTests.cs:line 34
at FluentAssertions.Specialized.ActionAssertions
.InvokeSubjectWithInterception()
.
|
MSTest
|
Fluent Assertions
|
Action act = () => func();
// MSTest V2
Assert.ThrowsException<InvalidOperationException>(act);
|
Action act = () => func();
act.Should().ThrowExactly<InvalidOperationException>();
|
Assert.ThrowsException failed. Threw exception InvalidCastException, but exception ArgumentNullException was expected.
Exception Message: Specified cast is not valid.
Stack Trace: at UnitTests2.ExceptionTests.<>c.<Snippet01v2_Old>b__2_0() in C:\Path\To\UnitTests\ExceptionTests.cs:line 44
at UnitTests2.ExceptionTests.<>c__DisplayClass2_0.<Snippet01v2_Old>b__1() in C:\Path\To\UnitTests\ExceptionTests.cs:line 47
at Microsoft.VisualStudio.TestTools.UnitTesting.Assert
.ThrowsException[T](Action action, String message, Object[] parameters)
|
Expected a <System.ArgumentNullException> to be thrown, but found a <System.InvalidCastException>: System.InvalidCastException with message "Specified cast is not valid."
at UnitTests2.ExceptionTests.<>c.<Snippet01_New>b__1_0() in C:\Path\To\UnitTests\ExceptionTests.cs:line 31
at UnitTests2.ExceptionTests.<>c__DisplayClass1_0.<Snippet01_New>b__1() in C:\Path\To\UnitTests\ExceptionTests.cs:line 34
at FluentAssertions.Specialized.ActionAssertions
.InvokeSubjectWithInterception()
.
|
MSTest
|
Fluent Assertions
|
[ExpectedException(typeof(SystemException),
AllowDerivedTypes = true)]
public void MyTest()
{
func();
}
|
public void MyTest()
{
Action act = () => func();
act.Should().Throw<InvalidOperationException>();
}
|
Test method threw exception System.InvalidCastException, but exception System.ArgumentException or a type derived from it was expected. Exception System.InvalidCastException: Specified cast is not valid.
|
Expected a <System.ArgumentException> to be thrown, but found a <System.InvalidCastException>: System.InvalidCastException with message "Specified cast is not valid."
at UnitTests2.ExceptionTests.<>c.<Snippet02_New>b__3_0() in C:\Path\To\UnitTests\ExceptionTests.cs:line 57
at UnitTests2.ExceptionTests.<>c__DisplayClass3_0.<Snippet02_New>b__1() in C:\Path\To\UnitTests\ExceptionTests.cs:line 60
at FluentAssertions.Specialized
.ActionAssertions.InvokeSubjectWithInterception().
|
MSTest
|
Fluent Assertions
|
[ExpectedException(typeof(InvalidOperationException))]
public void MyTest()
{
try
{
func();
}
catch (InvalidOperationException ex)
{
ex.Message.Should().Be(errorMessage);
throw;
}
}
|
public void MyTest()
{
Action act = () => func();
act.Should().ThrowExactly<InvalidOperationException>()
.WithMessage(errorMessage);
}
|
Expected string to be
"expectedMessage" with a length of 15, but
"actualMessage" has a length of 13.
|
Expected exception message to match the equivalent of
"expectedMessage", but
"actualMessage" does not.
|