首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >正确模拟SqlConnection

正确模拟SqlConnection
EN

Stack Overflow用户
提问于 2022-06-15 08:43:43
回答 1查看 152关注 0票数 0

我试图模仿下面的方法,

代码语言:javascript
复制
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

代码语言:javascript
复制
 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);
EN

回答 1

Stack Overflow用户

发布于 2022-06-15 09:11:15

您只能模拟abstract classesinterfaces,所以这是行不通的。

这段代码实例化了一个SqlConnection,它没有使用您在测试中设置的Mock<IDbConnection>。如果您确实想要对此代码进行单元测试,那么代码本身就需要更改;它需要以某种方式传递一个IDbConnection,无论是作为构造函数参数(您需要有一个非static类)还是作为一个参数传递给方法本身,然后您可以对其进行模拟。

我建议不要对这个方法进行单元测试,但是,您想解决什么问题呢?通常认为不良做法修改代码只是为了能够测试它。如果您想测试这一点,您可以考虑集成测试;如果这段代码是API的一部分,您可以(例如)在该级别上进行端到端测试。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72628333

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档