Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Openness for Caller Argument Expression in Assert failure messages #1154

Open
johnthcall opened this issue Jul 18, 2022 · 8 comments
Open

Openness for Caller Argument Expression in Assert failure messages #1154

johnthcall opened this issue Jul 18, 2022 · 8 comments

Comments

@johnthcall
Copy link
Contributor

johnthcall commented Jul 18, 2022

Description

With .Net 6 Caller Argument Expression was added, this could be used in testfx to provide the expression which failed the check. Doing this could provider consumers more out of the box detail about what caused the assert to fail without having to manually provide messages.

Sample Code change

#if !NET6_0_OR_GREATER
        public static void IsNull(object value)
        {
            IsNull(value, string.Empty, null);
        }
#endif

        public static void IsNull(
            object value,
#if !NET6_0_OR_GREATER
            string message)
#else
            [CallerArgumentExpression("value")]string message = "")
#endif
        {
            IsNull(value, message, null);
        }

Work required

  • Add .Net 6 as a built/packaged runtime
  • Modify Assert code to make the flows without a message removed in .Net 6 so that code like Assert.IsNull(myParam) execute passing myParam as the message.

Change in behavior

Currently a failing call to Assert.IsNull without a message will just return Assert.IsNull failed. This would change to Assert.IsNull failed. myParam which could be considered a breaking change and a result a no-go.

AB#1588958

@Evangelink
Copy link
Member

Fixed by #1154

@johnthcall
Copy link
Contributor Author

Fixed by #1172

@Evangelink
Copy link
Member

Hey @johnthcall, thanks! And sorry for the typo :)

@Evangelink
Copy link
Member

Evangelink commented Sep 14, 2022

Reopening the issue as changes are reverted. Long story short we misidentified the impact and as it is introducing some breaking changes we will postpone its fix in v4 of MSTest.

@CameronBellNZX
Copy link

Just to confirm, is [CallerArgumentExpression] not supported at all currently by MSTest? Meaning no methods using the attribute would be able to be unit tested using MSTest?

@Evangelink
Copy link
Member

If your method has some argument marked with the CallerArgumentExpression attribute there is no problem for the method to be tested. The goal of this ticket is to rewrite MSTest assertions methods to be using this attribute so that if the user provides no custom message we can provide a better default message (being the caller expression).

@CameronBellNZX
Copy link

Ahh I see, thanks for the clarification

@Meir017
Copy link

Meir017 commented Jun 11, 2024

I think this can be achieved by creating extension methods on the Assert class.

usage would be something like:

[TestMethod]
public void Test()
{
    object subject = ...;
    Assert.That.IsNotNull(subject);
}

// extension:
public static class AssertExtensions
{
    public static void IsNotNull(this Assert assert, object subject,
        [CallerArgumentExpression(nameof(subject))] string actualExpression = "")
    {
        var message ??= $"Expected {actualExpression} to not be null.";
        Assert.IsNotNull(subject, message);
    }
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

6 participants