【问题标题】:How can I stub IDBconnection如何存根 IDBconnection
【发布时间】:2015-07-10 16:37:00
【问题描述】:

我正在为我的数据库连接编写单元测试。

我有以下课程

Public class A
{
    public IDbConnection _dbConnection;

    public A()
    {
       _dbConnection = new SqlConnection(connectionStringName);
    }

    public int ExecuteNoneQuery(CommandDefination command)
    {
       return _dbConnection.Execute(command);
    }
}

我想测试这个类,如何使用 Microsoft Stub/Shim 进行测试

我已经编写了以下代码,但它不起作用。

[TestMethod]
public void TestMethod1()
{
    StubIDbConnection stubIDbConnection = new StubIDbConnection();
    stubIDbConnection.Execute =(null) => -1;
    var a = new classA();
    int answer = a.ExecuteNoneQuery(null);
    Assert.AreEqual(-1, answer);

 }

【问题讨论】:

    标签: unit-testing mstest stub microsoft-fakes shim


    【解决方案1】:

    execute 方法在 IDbConnection/SqlConnection 中不存在。因此我假设您已经创建了一个自定义接口和类。

    测试代码的正确方法是将代码更改为“设计为可测试的代码”:

    public class A
    {
        public IDbConnection _dbConnection;
    
        public A() : this(new SqlConnection()){}
    
        public A(IDbConnection connection)
        {
            _dbConnection = connection;
        }
    }
    

    现在你可以注入你的假连接了:

    [TestMethod]
    public void TestMethod1()
    {
        StubIDbConnection stubIDbConnection = new StubIDbConnection();
        stubIDbConnection.Execute =(null) => -1;
        var a = new classA(stubIDbConnection);
        int answer = a.ExecuteNoneQuery(null);
        Assert.AreEqual(-1,-1);
    }
    

    如果您不想更改代码。您必须创建shim,然后更改您的测试方法:

        [TestMethod]
        public void TestMethod1()
        {
            using (ShimsContext.Create())
            {
                System.Data.SqlClient.Fakes.ShimSqlConnection.AllInstances.Execute = 
                (connection, command) =>
                {
                    if (command != null)
                        throw new Exception("command is not null");
    
                    return -1;
                };
    
                var a = new classA();
                int answer = a.ExecuteNoneQuery(null);
                Assert.AreEqual(-1, -1);
            }
        }
    

    编辑

    您遇到的问题是因为 Execute 方法有多个重载。

    将您的测试方法更改为:

        [TestMethod]
        public void TestMethod1()
        {
            using (ShimsContext.Create())
            {
                Dapper.Fakes.ShimSqlMapper.ExecuteIDbConnectionCommandDefinition =
                    (connection, command) =>
                    {
                        //add here params verification...
    
                        return -1;
                    };
    
                var a = new A();
                int answer = a.ExecuteNoneQuery(new CommandDefinition());
                Assert.AreEqual(-1, answer);
            }
        }
    

    【讨论】:

    • 我正在使用 Dapper(第三方库)来执行我的 sql,所以我不能修改代码,我必须使用 Shim。以下是我的代码,但在第 5 行出现编译器错误 [错误 102 无法分配给“执行”,因为它是“方法组”]
    • 1 使用 (ShimsContext.Create()) 2 { 3 4 var shimSqlConnection = new System.Data.SqlClient.Fakes.ShimSqlConnection(); 5 shimSqlConnection.Instance.Execute = (connection, command) => 6 { 7 if (command != null) 8 throw new Exception("command is not null"); 9 10 返回 -1; 11}; 12 }
    • @HardikShah 使用 Dapper 的信息对于找到解决方案是必要的。我编辑了我的答案...
    【解决方案2】:

    您可以轻松地使用A类的构造函数来插入您的依赖项,将以下构造函数添加到A类:

    public A(IDBConnection connection)
    {
       _dbConnection = connection;
    }
    

    那么你的测试会是这样的:

    [TestMethod]
    public void TestMethod1()
    {
        StubIDbConnection stubIDbConnection = new StubIDbConnection();
        stubIDbConnection.Execute =(null) => -1;
        var a = new classA(stubIDbConnection);
        int answer = a.ExecuteNoneQuery(null);
        Assert.AreEqual(-1,answer);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-10-09
      • 2015-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-17
      • 1970-01-01
      相关资源
      最近更新 更多