How can I stub IDBconnection

人走茶凉 提交于 2019-12-13 05:01:08

问题


I am writting Unit Test for my database connection.

I have following class

Public class A
{
    public IDbConnection _dbConnection;

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

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

I want to test this class, how I can test with Microsoft Stub/Shim

I have written following code, but it is not working.

[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);

 }

回答1:


The method execute doesn't exist in IDbConnection / SqlConnection. Therefore I assume that you have created a custom interface and class.

The right way to test your code is to change the code into "code that designed to be a testable":

public class A
{
    public IDbConnection _dbConnection;

    public A() : this(new SqlConnection()){}

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

Now you can inject your fake 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);
}

If you don't want to change your code. You have to create shim, and then change your test method:

    [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);
        }
    }

Edit

The problem you've faced occurred because Execute method has several overloads.

Change your test method to:

    [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);
        }
    }



回答2:


You can easely use the constructor to of class A to insert your dependencies, add the following constructor to class A:

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

Then you test will look like:

[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);
}


来源:https://stackoverflow.com/questions/29976826/how-can-i-stub-idbconnection

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!