Как проверить SqlParameter на равенство - PullRequest
3 голосов
/ 02 ноября 2009

Используя NUnit и NMock2, я не смог сравнить то, что мне показалось одинаковыми SqlParameters:

SqlParameter param1 = new SqlParameter("@Id", 1);
SqlParameter param2 = new SqlParameter("@Id", 1);
Assert.IsTrue(param1.Equals(param2));  // This failed

Я наткнулся на эту проблему, пытаясь проверить выполнение метода с использованием 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();
    }

Я получил эту ошибку:

NMock2.Internal.ExpectationException: неожиданный вызов sqlDao.ExecuteNonQuery ("usp_Update_Comment",) Ожидаемое: 1 раз: sqlDao.ExecuteNonQuery (равно «usp_Update_Comment», равно <@ChangeId>) [вызывается 0 раз]

Вопросы:

  • Как вы тестируете с NMock2, когда вы Ожидаемый параметр - SqlParameter?
  • Как вы сравниваете равенство двух SqlParameters?

1 Ответ

2 голосов
/ 02 ноября 2009

Поскольку .Equals () использует реализацию Equals по умолчанию, насколько я знаю (это означает, что SqlParameter будет "равняться" только другому SqlParameter, если они являются одним и тем же объектом), вам нужно будет напрямую опросить свойства параметр, обеспечивающий передачу правильных данных.

Вызов Has.Property в .With позволяет проверить свойства параметра, не требуя, чтобы параметр равнялся некоторому другому значению. Попробуйте следующее:

Expect.Once.On(mockSqlDao).Method("ExecuteNonQuery")
          .With("usp_Update_Comment", Has.Property("ParameterName").EqualTo("@Id") & 
                                      Has.Property("Value").EqualTo(1));
...