我看到了这个回答,我有兴趣使用 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; }
}
单元测试
[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))
System.Data.SqlClient
。 - AppDeveloper