简体   繁体   中英

How can I stub IDBconnection

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

 }

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

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM