Eu tenho isso E sim, é um bug.
O problema é que existem dois níveis de coisas string.Format
acontecendo aqui.
O primeiro nível de formatação é algo como:
string template = string.Format("Expected: {0}; Actual: {1}; Message: {2}",
expected, actual, message);
Em seguida, usamos string.Format
com os parâmetros que você forneceu:
string finalMessage = string.Format(template, parameters);
(Obviamente, há culturas sendo fornecidas e algum tipo de higienização ... mas não o suficiente.)
Isso parece bom - a menos que os próprios valores esperados e reais terminem com colchetes, depois de serem convertidos em uma string - o que eles fazem Size
. Por exemplo, seu primeiro tamanho acaba sendo convertido para:
{Width=0, Height=0}
Portanto, o segundo nível de formatação é algo como:
string.Format("Expected: {Width=0, Height=0}; Actual: {Width=1, Height=1 }; " +
"Message = Failed expected {0} actually is {1}", struct1, struct2);
... e é isso que está falhando. Ai.
Na verdade, podemos provar isso facilmente enganando a formatação para usar nossos parâmetros para as partes esperadas e reais:
var x = "{0}";
var y = "{1}";
Assert.AreEqual<object>(x, y, "What a surprise!", "foo", "bar");
O resultado é:
Assert.AreEqual failed. Expected:<foo>. Actual:<bar>. What a surprise!
Claramente quebrado, pois não esperávamos foo
nem o valor real bar
!
Basicamente, é como um ataque de injeção de SQL, mas no contexto menos assustador de string.Format
.
Como solução alternativa, você pode usar o string.Format
que StriplingWarrior sugere. Isso evita que o segundo nível de formatação seja executado no resultado da formatação com os valores reais / esperados.
Assert.AreEqual(struct1, struct2, string.Format("Failed expected {0} actually is {1}
, struct1.ToString (), struct2.ToString ())) `?