Я пытаюсь выполнить модульное тестирование своей реализации интерфейса, и у меня возникли небольшие трудности с успешным макетом параметра SqlTransaction для одного из методов интерфейса.
Вот как выглядят интересующий меня интерфейс и тестируемый метод ..
public class MyInterface
{
void MyMethod(SqlTransaction SharedTransaction, DateTime EventTime);
}
public class MyImplementation : MyInterface
{
public void MyMethod(SqlTransaction SharedTransaction, DateTime EventTime)
{
DateTime dtLastEventTime = DateTime.MinValue;
using(SqlCommand comm = SharedTransaction.Connection.CreateCommand())
{
comm.CommandText = SQL_GET_LAST_EVENTTIME_DEFINED_ELSEWHERE;
comm.Parameters.AddWithValue("ParamName", 123);
object oResult = comm.ExecuteScalar();
dtLastEventTime = DateTime.Parse(oResult.ToString());
}
//Do something with dtLastEventTime
}
}
Я использовал Moq и различные синтаксические подходы для макетирования объектов базы данных, и мне не повезло ... (Мне пришлось сделать какое-то преобразование в объекты System.Data.Common, чтобы получить немного далее .. DbTransaction, DbConnection, DbCommand и т. д.).
Что я хотел бы знать, так это в первую очередь, можно ли таким образом смоделировать транзакцию или я лаю здесь не то дерево. К счастью, я могу преобразовать интерфейс для использования общего параметра DbTransaction, а не SqlTransaction для конкретного провайдера, но я не уверен, что мне так трудно с этим издеваться.
Вот (и это может быть совершенно неверно, поэтому, пожалуйста, исправьте меня или прокомментируйте, если я не совсем правильно подхожу к этому), что у меня так далеко за насмешливый код ...
var mockParams = new Mock<DbParameterCollection>();
mockParams.Setup(p => p.Add(new SqlParameter("ParamName", 123)));
var mockCommand = new Mock<DbCommand>();
mockCommand.Setup(p => p.Parameters).Returns(mockParams.Object);
var mockConnection = new Mock<DbConnection>();
mockConnection.Setup(con => con.CreateCommand()).Returns(mockCommand.Object);
var mockTrans = new Mock<DbTransaction>();
mockTrans.Setup(t => t.Connection).Returns(mockConnection.Object);
Однако, похоже, это вызывает исключение ArgumentException в строке mockCommand.Setup.
(Неверная настройка для не перезаписываемого элемента)
Есть ли у кого-нибудь какие-либо идеи или предложения о том, как я мог бы правильно выполнить модульное тестирование этого метода с поддельным параметром SqlTransaction?