如何测试SqlParameter是否相等

时间:2009-11-02 15:49:12

标签: unit-testing nunit c#-2.0 sqlparameters nmock2

使用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 个答案:

答案 0 :(得分:2)

因为.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));