我试图模仿下面的方法,
public static object ExecuteGetObj(string query)
{
object obj = null;
using (var connection = new SqlConnection(ConfigurationManager.ConnectionStrings["Default"].ConnectionString))
{
connection.Open();
using (SqlCommand cmd = new SqlCommand(query, connection))
{
obj = cmd.ExecuteScalar();
}
}
return obj;
}但是它没有使用模拟SqlConnection,而是试图创建SqlConnection
var command = new Mock<IDbCommand>();
command.Setup(x => x.ExecuteScalar())
.Verifiable();
var connection = new Mock<IDbConnection>();
connection
.Setup(m => m.CreateCommand())
.Returns(command.Object);
connection.Object.Open();
var obj = Common.ExecuteGetObj(sql);
Assert.IsNull(obj);发布于 2022-06-15 09:11:15
您只能模拟abstract classes或interfaces,所以这是行不通的。
这段代码实例化了一个SqlConnection,它没有使用您在测试中设置的Mock<IDbConnection>。如果您确实想要对此代码进行单元测试,那么代码本身就需要更改;它需要以某种方式传递一个IDbConnection,无论是作为构造函数参数(您需要有一个非static类)还是作为一个参数传递给方法本身,然后您可以对其进行模拟。
我建议不要对这个方法进行单元测试,但是,您想解决什么问题呢?通常认为不良做法修改代码只是为了能够测试它。如果您想测试这一点,您可以考虑集成测试;如果这段代码是API的一部分,您可以(例如)在该级别上进行端到端测试。
https://stackoverflow.com/questions/72628333
复制相似问题