0

パラメータとして SqlDataReader オブジェクトを必要とするメソッドがあり、そのオブジェクトをモックしたテストがあり、すべて正常に機能しました。

しかし、今はその方法を変更する必要があります。IDataReader をパラメーターとして持つ新しいメソッドのみを呼び出す必要がありますが、これは問題です。モック化された SqlDataReader を新しいメソッドのパラメーターとして転送すると、データが失われ、理由がわからないからです。

このようなもの:

void method(SqlDataReader mockedObject)
{
   // example property
   mockedObject.FieldCount; // for example the value is 1;
   newMethod(mockedObject);
}

void newMethod(IDataReader newObject)
{
   // example property
   newObject.FieldCount // here value is 0;
}

SqlDataReader オブジェクトを IDataReader 型の新しい変数にコピーするだけの場合、データも消去されることがわかりました。

このようなもの:

void method(SqlDataReader mockedObject)
{
   IDataReader variable = mockedObject;
}

適切なコード:

=========================================================================================
        [TestMethod()]
    [DeploymentItem("IICMS.dll")]
    public void CheckNullableDateTimeTest_SqlDataReader_Valid()
    {
        MockRepository mocks = new MockRepository();
        SqlDataReader reader = mocks.DynamicMock<SqlDataReader>();
        string column = "test";
        DateTime? expected = new DateTime(2, 1, 1);
        Nullable<DateTime> actual;

        reader.Stub(r => r[column]).Return(expected);
        reader.Stub(r => r.FieldCount).Return(1);
        mocks.ReplayAll();

        actual = Utility_Accessor.CheckNullableDateTime(reader, column);
        Assert.AreEqual(expected, actual);
    }
======================================================================================
        public static DateTime? CheckNullableDateTime(SqlDataReader read, string column)
    {
        return GetValue<DateTime?>(read, column, null);
    }
======================================================================================
public static T GetValue<T>(IDataReader reader, string columnName, T defaultValue)
    {
        try
        {
            for (int i = 0; i < reader.FieldCount; i++)
            {
                if (reader.GetName(i) == columnName)
                {
                    object value = reader[i];
                    return Convert.IsDBNull(value) ? defaultValue : (T)value;
                }
            }

            return defaultValue;
        }
        catch
        {
            return defaultValue;
        }
    }

コードがあります.2番目と3番目の方法は他のdllにありますが、何にも影響しません。オブジェクトは RhinoMocks でモックされます ;)

SqlDataReader オブジェクト (読み取り) を GetValue メソッドに転送した後、データが失われます (つまり、FieldCount は 0 に等しく、Check.. メソッドでは適切な値 = 1 です)。

4

1 に答える 1

0

これを説明することはできませんが、テストメソッドを以下の形式に変更すると、すべてのオブジェクトフィールドが各メソッド(CheckNullStringおよびGetValue)で使用可能になります。

    [TestMethod()]
    [DeploymentItem("IICMS.dll")]
    public void CheckNullableDateTimeTest_SqlDataReader_Valid()
    {
        MockRepository mocks = new MockRepository();
        SqlDataReader reader = mocks.DynamicMock<SqlDataReader>();
        IDataReader reader2 = reader;
        string column = "test";
        DateTime? expected = new DateTime(2,1,1);
        DateTime? actual;

        reader.Stub(r => r[column]).Return(invalidValue);
        reader.Stub(r => r[0]).Return(invalidValue);
        reader.Stub(r => r.FieldCount).Return(1);
        reader.Stub(r => r.GetName(0)).Return(column);

        reader2.Stub(r => r[column]).Return(invalidValue);
        reader2.Stub(r => r[0]).Return(invalidValue);
        reader2.Stub(r => r.FieldCount).Return(1);
        reader2.Stub(r => r.GetName(0)).Return(column);
        mocks.ReplayAll();

        actual = Utility_Accessor.CheckNullString(reader, column);
        Assert.AreEqual(expected, actual);
    }
于 2012-10-11T07:55:21.210 に答える