The example code that follows throws the following exception;
System.InvalidOperationException : Invalid attempt to read when no data is present.
What is the correct way to Mock this?
using System;
using System.Data.SqlClient;
using System.Data;
using TypeMock;
using NUnit.Framework;
namespace People
{
public class Person
{
private int _Id = -1;
public string Name = string.Empty;
private Person(int Id) { DataFetch(Id); }
public static Person GetPerson(int Id) { return new Person(Id); }
private void DataFetch(int Id)
{
using (SqlConnection Cn = new SqlConnection("ConnectionString"))
{
Cn.Open();
using (SqlCommand Cm = Cn.CreateCommand())
{
Cm.CommandType = CommandType.StoredProcedure;
Cm.CommandText = "getPerson";
Cm.Parameters.AddWithValue("@Id", Id);
using (SqlDataReader dr = Cm.ExecuteReader())
{
_Id = Id;
Name = dr.GetString(1);
}
}
}
}
}
[TestFixture]
public class PersonTestFixture
{
[Test]
public void TestGettingAPerson()
{
const int PERSON_ID = 1;
const string PERSON_NAME = "John Smith";
Mock MockSqlConnection = MockManager.MockAll(typeof(SqlConnection));
Mock MockSqlCommand = MockManager.MockAll(typeof(SqlCommand));
Mock MockSqlParameters = MockManager.MockAll(typeof(SqlParameterCollection), Constructor.NotMocked);
Mock MockSqlDataReader = MockManager.MockAll(typeof(SqlDataReader), Constructor.Mocked);
SqlDataReader dr = (SqlDataReader)MockManager.MockObject(typeof(SqlDataReader), Constructor.Mocked, null, null).Object;
MockSqlConnection.ExpectCall("Open", 1);
MockSqlConnection.ExpectCall("Close", 1);
MockSqlParameters.ExpectUnmockedCall("AddWithValue", 1).Args("@Id", PERSON_ID);
MockSqlCommand.ExpectAndReturn("ExecuteReader", dr, 1);
MockSqlDataReader.ExpectAndReturn("GetString", PERSON_NAME, 1).Args(1);
Person JohnSmith = Person.GetPerson(PERSON_ID);
Assert.AreEqual(PERSON_NAME, JohnSmith.Name);
}
}
}