I have a method that takes a System.Data.DataSet and uses it to construct an object. I am trying to mock the dataset in order to test that the method constructs the object properly.
The method I am testing is the following:
My test is the following:
When I run this test if fails when data is read from the dataset with the following exception:
"InvalidCastException : Object cannot be cast from DBNull to other types."
I have tried mocking the DataSet several different ways and cannot get the test to work.
Before this I attempted to create mock tables using
Mock.Create<DataTable>() and
Mock.Arrange(() => dataset.Tables[0]).Returns(mockTable)
but the test still would fail because dataset.Table[0] would throw a IndexOutOfRangeException.
How can I properly mock a DataSet?
Thanks
The method I am testing is the following:
public
Box CreateBoxFromDataSet(DataSet dataSet,
int
rowNumber = 0)
{
const
int
BOX_TABLE = 0;
const
int
METADATA_TABLE = 1;
Box box =
new
Box() {
ID = Convert.ToInt64(dataSet.Tables[BOX_TABLE].Rows[rowNumber][
"BoxID"
]),
Name = dataSet.Tables[BOX_TABLE].Rows[rowNumber][
"Name"
].ToString()
};
if
(dataSet.Tables.Count > 1)
{
foreach
(DataRow row
in
dataSet.Tables[METADATA_TABLE].Rows)
{
long
propertyID = Convert.ToInt64(row[
"MetaPropertyID"
]);
string
value = NullableConverter.ToString(row[
"MetadataValue"
]);
box.ApplyMetadata(propertyID, value);
}
}
return
box;
}
My test is the following:
[TestMethod]
public
void
CreateBoxFromDataSet_ReturnsBox()
{
//Arrange
long
expectedID = 300;
Box actual =
null
;
var manager =
new
BoxManager();
var dataset =
new
DataSet();
dataset.Tables.AddRange(
new
[] {
new
DataTable(
"Box"
),
new
DataTable(
"Metadata"
) });
dataset.Tables[0].Rows.Add(dataset.Tables[0].NewRow());
dataset.Tables[1].Rows.Add(dataset.Tables[1].NewRow());
dataset.Tables[2].Rows.Add(dataset.Tables[2].NewRow());
Mock.Arrange(() => dataset.Tables[0].Rows[0][
"BoxID"
]).Returns(expectedID);
Mock.Arrange(() => dataset.Tables[0].Rows[0][
"Name"
]).Returns(
"BoxName"
);
Mock.Arrange(() => dataset.Tables[1].Rows[0][
"MetaPropertyID"
]).Returns(700);
Mock.Arrange(() => dataset.Tables[1].Rows[0][
"MetadataValue"
]).Returns(
"MetadataValue"
);
//Act
actual = manager.CreateBoxFromDataSet(dataset);
//Assert
Assert.IsNotNull(actual);
}
When I run this test if fails when data is read from the dataset with the following exception:
"InvalidCastException : Object cannot be cast from DBNull to other types."
I have tried mocking the DataSet several different ways and cannot get the test to work.
Before this I attempted to create mock tables using
Mock.Create<DataTable>() and
Mock.Arrange(() => dataset.Tables[0]).Returns(mockTable)
but the test still would fail because dataset.Table[0] would throw a IndexOutOfRangeException.
How can I properly mock a DataSet?
Thanks