Я наткнулся на этот ответ , и я заинтересован в реализации второго ответа с использованием Fake. Вот другой один.
Я не совсем понимаю все концепции и все еще читаю и понимаю документация , может кто-нибудь помочь с использованием моего кода, где я пытаюсь получить доступ к списку клиентов накак использовать здесь Fake / Shim / Stub / Mock?
Вы можете переписать метод FindAll
тоже на всякий случай, если он будет реорганизован для принятия зависимостей.
Редактирование после обсуждения
public class Data
{
private Func<IDbConnection> Factory { get; }
public Data(Func<IDbConnection> factory)
{
Factory = factory;
}
public IList<Customer> FindAll()
{
using (var connection = Factory.Invoke())
{
const string sql = "SELECT Id, Name FROM Customer";
using (var command = new SqlCommand(sql, (SqlConnection) connection))
{
command.Connection.Open();
using (var reader = command.ExecuteReader())
{
IList<Customer> rows = new List<Customer>();
while (reader.Read())
{
rows.Add(new Customer
{
Id = reader.GetInt32(reader.GetOrdinal("Id")),
Name = reader.GetString(reader.GetOrdinal("Name"))
});
}
return rows;
}
}
}
}
}
Заказчик
public class Customer
{
public int Id { get; set; }
public string Name { get; set; }
}
UnitTest
[TestMethod]
public void TestDB()
{
var commandMock = new Mock<IDbCommand>();
var readerMock = new Mock<IDataReader>();
commandMock.Setup(m => m.ExecuteReader()).Returns(readerMock.Object).Verifiable();
var parameterMock = new Mock<IDbDataParameter>();
commandMock.Setup(m => m.CreateParameter()).Returns(parameterMock.Object);
commandMock.Setup(m => m.Parameters.Add(It.IsAny<IDbDataParameter>())).Verifiable();
var connectionMock = new Mock<IDbConnection>();
connectionMock.Setup(m => m.CreateCommand()).Returns(commandMock.Object);
var data = new Data(() => connectionMock.Object);
var result = data.FindAll();
Console.WriteLine(result);
}
Ошибка
Был сбой с зависимостью, добавлено System.Data.SqlClient
, следует еще одна ошибка.
System.InvalidCastException: Невозможно привести объект типа 'Castle.Proxies.IDbConnectionProxy' квведите 'System.Data.SqlClient.SqlConnection'.
, указывающий на эту строку
using (var command = new SqlCommand(sql, (SqlConnection) connection))