Como SqlParameter teste de igualdade
-
12-09-2019 - |
Pergunta
Usando NUnit e NMock2 eu não era capaz de comparar o que eu achava que eram os mesmos SqlParameters:
SqlParameter param1 = new SqlParameter("@Id", 1);
SqlParameter param2 = new SqlParameter("@Id", 1);
Assert.IsTrue(param1.Equals(param2)); // This failed
Eu Tropecei este problema, ao tentar testar uma execução de um método utilizando NMock2
[Test]
public void UpdateComments()
{
const int arbitraryId = 1;
Comment comment = new Comment();
SqlParameter idParam = new SqlParameter("@ChangeId", arbitraryId);
Expect.Once.On(mockSqlDao).Method("ExecuteNonQuery")
.With("usp_Update_Comment", idParam);
changeDao.UpdateComment(arbitraryId, comment);
mocks.VerifyAllExpectationsHaveBeenMet();
}
Recebi este erro:
NMock2.Internal.ExpectationException: invocação inesperada de sqlDao.ExecuteNonQuery ( "usp_Update_Comment",) Esperado: 1 tempo: sqlDao.ExecuteNonQuery (igual a "usp_Update_Comment", igual a <@ChangeId>) [chamados 0 vezes]
Perguntas:
- Como você testar com NMock2 quando você Espera parâmetro é SqlParameter?
- Como você compara a igualdade de dois SqlParameters?
Solução
Porque .Equals () está usando a implementação padrão de Iguais, tanto quanto eu sei (o que significa que um SqlParameter vai apenas "igual" outra SqlParameter se eles são o mesmo objeto), você vai precisar para interrogar directamente as propriedades de o parâmetro para garantir que os dados corretos está sendo passado.
A chamada Has.Property dentro .Com permite que você verifique as propriedades de um parâmetro sem exigir que um parâmetro é igual a qualquer outro valor. Tente o seguinte:
Expect.Once.On(mockSqlDao).Method("ExecuteNonQuery")
.With("usp_Update_Comment", Has.Property("ParameterName").EqualTo("@Id") &
Has.Property("Value").EqualTo(1));