Stubbing / mocking a database in .Net Stubbing / mocking a database in .Net database database

Stubbing / mocking a database in .Net


From reading the other answers and various comments you've made, it seems you want an easier way to generate large populated datasets for integration testing that doesn't hit the database.

NBuilder is a great open-source library that I've successfully used to create large amounts of test data. Simply combine NBuilder, a few basic POCO object classes, and some reflection - you'll have plenty of huge datatables you can easily combine into datasets in no time:

public class Person{    public string First { get; set; }    public string Last { get; set; }    public DateTime Birthday { get; set; }}private DataTable GenerateDataTable<T>(int rows){    var datatable = new DataTable(typeof(T).Name);    typeof(T).GetProperties().ToList().ForEach(        x => datatable.Columns.Add(x.Name));    Builder<T>.CreateListOfSize(rows).Build()        .ToList().ForEach(            x => datatable.LoadDataRow(x.GetType().GetProperties().Select(                y => y.GetValue(x, null)).ToArray(), true));    return datatable;}var dataset = new DataSet();dataset.Tables.AddRange(new[]{        GenerateDataTable<Person>(50),        GenerateDataTable<Dog>(100)});


To unit test the transformation you really shouldn't need to mock the database at all. I suspect that you've tightly coupled the transformations with you database calls. What you want to do here is extract all your transformation logic into a class of it's own like the following:

public static Transformations{    public static DataSet TransformationA(DataSet dataSet)    {        //transformation logic here    }    public static DataSet TransformationB(DataSet dataSet)    {        //transformation logic here    }}

With this you can unit test only the transformations logic by passing in a dataset and then asserting the dataset returned has the correct transformations applied to it. This will prevent you from having to implement another data store (your 'fake' database) for testing purposes only.

Hopefully this helps


You could mock your DataAccess class with Rhinomocks and return a fake datatable. So you can test the code that uses this DataTable.

var mockedDatatable= GetMockdt();var mocks = new MockRepository();var dal = mocks.StrictMock<DataAccess>();using (mocks.Record()){  Expect.Call(dal.GetDataTableFromDatabase("", null)).Return(mockedDatatable).IgnoreArguments();}using (mocks.Playback()){  new SomeClass(dal);}

UPDATE the mockdt message

private static DataTable GetMockdt(){  var dt = new DataTable();  dt.Columns.Add("pageHeader");  dt.Columns.Add("templatename");  dt.Columns.Add("pageText");  dt.Columns.Add("pageTitleBar");  dt.Columns.Add("metaDescription");  dt.Columns.Add("pageStartCode");  dt.Columns.Add("pageEndCode");  dt.Columns.Add("templateStartCode");  dt.Columns.Add("templateEndCode");  dt.Columns.Add("Author");  dt.Columns.Add("version_date");  dt.Columns.Add("pageurl");  dt.Columns.Add("type");  dt.Columns.Add("isparent");  dt.Columns.Add("pagename");  dt.Columns.Add("parentname");  dt.Columns.Add("url");  var mockRow = dt.NewRow();  mockRow["pageHeader"] = "homepage";  mockRow["pageText"] = "<p>home</p>";  mockRow["templatename"] = "home";  mockRow["pageTitleBar"] = "homepages";  mockRow["metaDescription"] = "homepages";  mockRow["pageStartCode"] = "homepages";  mockRow["pageEndCode"] = "homepages";  mockRow["templateStartCode"] = "homepages";  mockRow["templateEndCode"] = "homepages";  mockRow["Author"] = "someone";  mockRow["version_date"] = "";  mockRow["pageurl"] = "home";  mockRow["type"] = "internal";  mockRow["isparent"] = "true";  mockRow["pagename"] = "homepage";  mockRow["parentname"] = "root";  mockRow["url"] = "homepage";  dt.Rows.Add(mockRow);  return dt;}