2015-04-30 10 views
0

Я пишу Unit Test для подключения к моей базе данных.Как я могу заглушить IDBconnection

У меня есть следующий класс

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

} 

ответ

0

Метод выполнить не существует в 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); 
} 

If вы не хотите менять свой код. Вы должны создать 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); 
     } 
    } 
+0

Я использую Dapper (сторонняя библиотека) для выполнения моего sql, поэтому я не могу изменять код, Я должен использовать Шим. Ниже мой код, но я получаю ошибку компилятора [Ошибка Невозможно назначить «Выполнить», потому что это «группа методов» \t] в строке № 5 –

+0

1 используя (ShimsContext.Create()) 2 { 4 var shimSqlConnection = new System.Data.SqlClient.Fakes.ShimSqlConnection(); 5 shimSqlConnection.Instance.Execute = (соединение, команда) => 6 { 7 if (command! = Null) 8 throw new Exception («команда не равна нулю»); 10 return -1; 11}; 12} –

+0

@HardikShah Информация об использовании Dapper необходима для поиска решения. Я отредактировал свой ответ ... –

0

Вы с легкостью можете использовать конструктор для класса А, чтобы вставить свою зависимость, добавьте следующий конструктор класса 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); 
}