Estou tentando afirmar a igualdade de duas System.Drawing.Size
estruturas e estou obtendo uma exceção de formato em vez da falha de declaração esperada.
[TestMethod]
public void AssertStructs()
{
var struct1 = new Size(0, 0);
var struct2 = new Size(1, 1);
//This throws a format exception, "System.FormatException: Input string was not in a correct format."
Assert.AreEqual(struct1, struct2, "Failed. Expected {0}, actually it is {1}", struct1, struct2);
//This assert fails properly, "Failed. Expected {Width=0, Height=0}, actually it is {Width=1, Height=1}".
Assert.AreEqual(struct1, struct2, "Failed. Expected " + struct1 + ", actually it is " + struct2);
}
Este é o comportamento pretendido? Estou fazendo algo errado aqui?
Assert.AreEqual(struct1, struct2, string.Format("Failed expected {0} actually is {1}
, struct1.ToString (), struct2.ToString ())) `?Respostas:
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:
Em seguida, usamos
string.Format
com os parâmetros que você forneceu:(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:Portanto, o segundo nível de formatação é algo como:
... 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:
O resultado é:
Claramente quebrado, pois não esperávamos
foo
nem o valor realbar
!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.fonte
%*n
equivalente? :(Acho que você encontrou um bug.
Isso funciona (lança uma exceção de declaração):
E isso funciona (gera a mensagem):
Mas isso não funciona (lança um
FormatException
):Não consigo pensar em nenhuma razão para esse comportamento ser esperado. Eu enviaria um relatório de bug. Enquanto isso, aqui está uma solução alternativa:
fonte
Eu concordo com @StriplingWarrior que isso realmente parece ser um bug com o método Assert.AreEqual () em pelo menos 2 sobrecargas. Como StiplingWarrior já apontou, o seguinte falha;
Tenho feito algumas experiências para ser um pouco mais explícito no uso do código. O seguinte também não funciona;
E
Isso me fez pensar. System.Drawing.Size é uma estrutura. E quanto a objetos? A lista param não especificar que a lista após a
string
mensagem éparams object[]
. Tecnicamente, sim, estruturas são objetos ... mas tipos especiais de objetos, ou seja, tipos de valor. Acho que é aí que está o bug. Se usarmos nosso próprio objeto com um uso e estrutura para semelhanteSize
, o seguinte realmente faz o trabalho;fonte
class
oustruct
, mas se oToString
valor contém chaves que se parecem com umString.Format
.Acho que a primeira afirmação está incorreta.
Em vez disso, use:
fonte