我使用的是C#和.NET Core和Microsoft.VisualStudio.TestTools.UnitTesting
。
打电话时:
StringAssert.Contains(my_text, my_needle);
使用一些my_text
值,例如:
StringAssert.Contains("foo bar baz", "hello");
将显示正确的错误消息:
StringAssert.Contains failed. String 'foo bar baz' does not contain string 'hello'. .
at ...
但是,如果my_text
有其他值,则会发生以下错误:
Test method MyTest threw exception:
System.FormatException: Input string was not in a correct format.
at System.Text.ValueStringBuilder.ThrowFormatError()
at System.Text.ValueStringBuilder.AppendFormatHelper(IFormatProvider provider, String format, ParamsArray args)
at System.String.FormatHelper(IFormatProvider provider, String format, ParamsArray args)
at System.String.Format(IFormatProvider provider, String format, Object[] args)
at ...
为什么会发生这种情况?
更新:我已将此作为错误报告提交。
发布于 2022-05-09 23:53:02
一个快速的解决方案是使用
StringAssert.Contains(my_text, my_needle, "", null);
这是正确的!
说明:使用我找到的调试器
public static void Contains(string value, string substring)
呼叫
public static void Contains(
string value,
string substring,
string message,
StringComparison comparisonType) {
// Calling:
StringAssert.Contains(value, substring, message, comparisonType, StringAssert.Empty);
哪个呼叫
public static void Contains(
string value,
string substring,
string message,
StringComparison comparisonType,
params object[] parameters)
{
... // calling:
Assert.HandleFail("StringAssert.Contains", finalMessage, parameters);
在HandleFail
内部,parameters
的值是object[]
,并且:
parameters != null ? string.Format(...) : Assert.ReplaceNulls(message)
触发格式调用(因为parameters
不是null
.)。
这好像是个虫子。
复制:
StringAssert.Contains("{", "x");
虽然这是可行的:
StringAssert.Contains("{", "x", "", null);
发布于 2022-05-09 23:40:21
一般来说,这种错误几乎总是由于插值字符串。您得到错误的原因(可能)是因为您的字符串中有{}。这就是为什么您的错误是这样的:
在System.String.Format(IFormatProvider provider,String格式,Object[] args)
因为在链的某个地方,您将有类似于string.Format()的东西,而在其中包含{}的字符串正在破坏它。为了解决这个问题,您可以通过将所有{}替换为双{{}来逃避它们。
https://stackoverflow.com/questions/72179163
复制相似问题