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?
Foi útil?

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));
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top