Pregunta

Acabo de empezar a usar Moles para burlarse de un código legado difícil. En esencia, estoy tratando de obtener un SqlDataAdapter para trabajar con moles. (Por cierto, he tenido éxito usando lunares con las clases de SQLDAtAreader y SQLCommand). He intentado crear un ejemplo de prueba de unidades "simple" a continuación, donde estoy tratando de obtener SQLDataadaptor para "Llenar" el conjunto de datos proporcionado. Luego, cuando se usa Moles, me estoy burlando de las diversas llamadas para recuperar datos del conjunto de datos. Creo que he configurado correctamente el conjunto de datos de manera correcta para que la recuperación de datos devolverá el objeto "muda" esperado y haga lo correcto.

Cuando corro a continuación puedo ver que se está ejecutando la expresión de lambda de FilldataSetString, se está ejecutando y "D" se está configurando en la DS "MUERED". Pero cuando se devuelve el método de llenado, el conjunto de datos pasado ("DSCEST") sigue siendo un "conjunto de datos" regular y no el "DataSet de muda". Por lo tanto, la primera afirmación no funciona correctamente y arroja una excepción de índiceOutofrangeException ("No se puede encontrar la Tabla 0."). En la primera afirmación, estoy esperando que se llamen los siguientes métodos "Moud" cuando DsTest.Tables [0] .Rows.Count se evalúa:

    ds.TablesGet
    tables.ItemGetInt32
    table.RowsGet
    rows.CountGet

Pero como DSCET no es el conjunto de datos "MUSED", ninguna de esas llamadas ocurre. Cualquier ayuda para determinar qué lúpulo con el parámetro de conjunto de datos de SqlDataAdapter sería muy apreciado.

Para que los siguientes funcionen, debe instalar "moles", system.data.data.data.xml, crear una referencia "System.Data.Moles". Estoy usando 0.94.0.0 del marco de Moles y ejecutando esto en Vs.NET 2010, con el conjunto de "Marco de destino" del proyecto de prueba ".NET Framework 4.0".

using System.Data;
using System.Data.Moles;
using System.Data.Common.Moles;
using System.Data.SqlClient;
using System.Data.SqlClient.Moles;
using System.Xml.Serialization;

[TestClass]
public class UnitTest1
{

    [TestMethod]
    [HostType("Moles")]
    public void IsolatedSqlDataAdaptorTest()
    {
        // Arrange
        Dictionary<string, object> backing = new Dictionary<string, object>() 
        {
            {"field", 5},
        };

        MSqlConnection.AllInstances.Open = (c) => { };
        MSqlConnection.AllInstances.Close = (c) => { };
        MSqlDataAdapter.ConstructorStringSqlConnection =
        (@this, cmd, conn) =>
        {
            // Setup a moled DataSet with 1 Table and 1 Row
            MDataRow row = new MDataRow()
            {
                // This is the method that ultimately gets called.
                ItemGetString = (key) => { return backing[key]; },
            };

            MDataRowCollection rows = new MDataRowCollection();
            rows.CountGet = () => { return 1; };
            rows.ItemGetInt32 = (i) => { return row; };

            MDataTable table = new MDataTable();
            table.RowsGet = () => { return rows; };

            MDataTableCollection tables = new MDataTableCollection();
            tables.ItemGetInt32 = (i) => { return table; };

            MDataSet ds = new MDataSet();
            ds.TablesGet = () => { return tables; };

            MSqlDataAdapter sdaMole = new MSqlDataAdapter(@this);
            MDbDataAdapter ddaMole = new MDbDataAdapter(sdaMole)
            {
                FillDataSetString = (d, s) =>
                {
                    d = ds;
                    return 1;
                },
            };
        };

        // Act
        DataSet dset = new DataSet();
        SqlDataAdapter da = new SqlDataAdapter(
            "select something from aTable",
            new SqlConnection());
        da.Fill(dset, "aTable");

        // Assert
        Assert.AreEqual(1, dset.Tables[0].Rows.Count, "Count");
        Assert.AreEqual(5, dset.Tables[0].Rows[0]["field"], "field");
    }
}

¿Fue útil?

Solución

Taking a fresh look at this question after a number of months as prompted by a suggestion, by @StingyJack, to mock the Fill method, I came up with the following to support my mocking requirements. It still doesn't really answer why the dataset was not being replaced with my moled dataset.

    [TestMethod]
    [HostType("Moles")]
    public void IsolatedSqlDataAdaptorTestWithFill()
    {
        // Arrange
        MSqlConnection.AllInstances.Open = c => { };
        MSqlConnection.AllInstances.Close = c => { };
        MSqlDataAdapter.ConstructorStringSqlConnection = (@this, cmd, conn) => { };
        MDbDataAdapter.AllInstances.FillDataSetString = (da, ds, s) =>
            {
                var dt = new DataTable(s);
                dt.Columns.Add(new DataColumn("string", typeof(string)));
                dt.Columns.Add(new DataColumn("int", typeof(int)));
                dt.Rows.Add("field", 5);
                ds.Tables.Add(dt);
                return 1;
            };

        // Act
        using (var dset = new DataSet())
        {
            using (var conn = new SqlConnection())
            {
                using (var da = new SqlDataAdapter("select something from aTable", conn))
                {
                    da.Fill(dset, "aTable");
                }
            }

            // Assert
            Assert.AreEqual(1, dset.Tables[0].Rows.Count, "Count");
            Assert.AreEqual("field", dset.Tables[0].Rows[0]["string"], "string");
            Assert.AreEqual(5, dset.Tables[0].Rows[0]["int"], "int");
        }
    }
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top