Rediger

Del via


MSTEST0038: Don't use 'Assert.AreSame' or 'Assert.AreNotSame' with value types

Property Value
Rule ID MSTEST0038
Title Don't use 'Assert.AreSame' or 'Assert.AreNotSame' with value types
Category Usage
Fix is breaking or non-breaking Non-breaking
Enabled by default Yes
Default severity Warning
Introduced in version 3.8.0
Is there a code fix Yes

Cause

The use of Assert.AreSame or Assert.AreNotSame with one or both arguments being a value type.

Rule description

Assert.AreSame and Assert.AreNotSame work by comparing the reference of the given expected/notExpected and actual arguments via ReferenceEquals. Hence, when you pass a value type, it is boxed.

If using AreSame, the assert will always fail. If using AreNotSame, the assert will always pass.

For AreSame, the only case when the assert passes is if both arguments are nullable value types whose values are both null. In this case, it's clearer to have two separate Assert.IsNull calls.

How to fix violations

Use Assert.AreEqual and Assert.AreNotEqual instead of Assert.AreSame and Assert.AreNotSame. If using Assert.AreSame and both arguments are nullable value types whose values are expected to be null, then two separate Assert.IsNull calls might be a better fit than AreEqual, depending on the intent of the test.

When to suppress warnings

Do not suppress a warning from this rule. Ignoring this rule will result in an assertion that will always fail or always pass.