Safer formatting of assertion messages #159
Merged
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Fixes #156.
Changes
While switching to NUnit v4 in #136, we used a naive approach to formatting the assertion message, where both the message and arguments specified by the caller are forwarded to
string.Format
. This caused assertions to fail when messages contained special characters recognized bystring.Format
, even when the caller did not intend any formatting to take place (only message string was specified, no arguments) - see discussion in #156, thanks @busraozis for reporting.The surprising aspect of this issue, as reported by @UrsMetz, was that using the same message with NUnit's "classic assert" succeeded, despite presence of special characters in the assertion message. Looking at NUnit's implementation I realized this is because NUnit does not pass the message and arguments directly to
string.Format
. Instead, they define a methodNUnit.Framework.AssertBase.ConvertMessageWithArgs
:This method does not call
string.Format
when no arguments are specified by the caller, i.e. it uses the assertion message as-is. This allows the caller to use any characters in the assertion message, as long as they don't specify any format arguments (which is most commonly the case, including the @busraozis issue).This pull request updates
Akka.TestKit.NUnit
to use NUnit'sConvertMessageWithArgs
method for formatting the assertion message, and adds a test that verifies that allITestKitAssertions
methods can be called with assertion message that contains specialstring.Format
sequences (like"{0}"
), as long as no format arguments are specified.Other changes
Checklist
For significant changes, please ensure that the following have been completed (delete if not relevant):