Как проверить SqlParameter на равенство

Используя 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 ответ

Решение

Поскольку.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));
Другие вопросы по тегам