3

使用 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 次]

问题:

  • 当您期望 Parameter 是 SqlParameter 时,如何使用 NMock2 进行测试?
  • 你如何比较两个 SqlParameters 的相等性?
4

1 回答 1

3

因为据我所知 .Equals() 正在使用 Equals 的默认实现(这意味着如果 SqlParameter 是同一个对象,它们只会“等于”另一个 SqlParameter ),您将需要直接询问参数的属性以确保传递正确的数据。

.With 中的 Has.Property 调用允许您检查参数的属性,而不要求参数等于某个其他值。尝试以下操作:

Expect.Once.On(mockSqlDao).Method("ExecuteNonQuery")
          .With("usp_Update_Comment", Has.Property("ParameterName").EqualTo("@Id") & 
                                      Has.Property("Value").EqualTo(1));
于 2009-11-02T16:35:17.817 回答