简体   繁体   English

模拟数据访问层Rhino模拟

[英]Mocking data access Layer Rhino mock

How can i mock data access layer using Rhino mocks I have the following classes: 我如何使用Rhino模拟来模拟数据访问层,我有以下课程:

 public interface IDataAccess
{
    int ExecuteNoneQuery(SqlConnection connection, string storedProcedureName,
                         IEnumerable<SqlParameter> sqlParameters);

}

public class DataAccess : IDataAccess
    {
     public int ExecuteNoneQuery(SqlConnection connection, string storedProcedureName,
                                    IEnumerable<SqlParameter> sqlParameters)
      {
         using (SqlCommand command = connection.CreateCommand())
        {
                // do some stuff
                return command.ExecuteNonQuery();

        }
    }
}

 public class DbOperation<T>
    {
        private IDataAccess _access;

        public DbOperation(IDataAccess access)
        {
            _access = access;
        }

        public int Insert(T item, SqlConnection connection,string spName)
        {
            IDbObjectFactory<T> parametersFactory = new SqlParameterFactory<T>();
            var parameters = (IList<SqlParameter>)parametersFactory.GetDbObject(item);
            return _access.ExecuteNoneQuery(connection, spName, parameters);
        }
    }

Here is an example with some explanations: 这是一个带有一些解释的示例:

To test the case: 要测试情况:
WHEN method ExecuteNoneQuery of class DataAccess is called 何时调用类DataAccess ExecuteNoneQuery方法
THEN command.ExecuteNonQuery() should be called: THEN command.ExecuteNonQuery()应该被调用:

// 1. Create `SqlCommand` Mock:
var command = MockRepository.GenerateMock<SqlCommand>();

// 2. Create `SqlConnection` Stub:
var connection = MockRepository.GenerateStub<SqlConnection>();

// 3. Setup connection.CreateCommand() to return mocked command:
connection
    .Stub(c => c.CreateCommand())
    .Return(command);

// 4. Do test action:
var dataAccess = new DataAccess();
dataAccess.ExecuteNoneQuery(connection, null, null);

// Assert command.ExecuteNonQuery() has been called:
command.AssertWasCalled(c => c.ExecuteNonQuery());

Hope that explains a bit how to use Rhino Mock. 希望能稍微解释一下如何使用Rhino Mock。

I assume you want to test DbOperation by mocking DataAccess. 我假设您想通过模拟DataAccess来测试DbOperation。

public void TestInsert()
    {
        var dataAccess = MockRepository.GenerateMock<IDataAccess>();

        var dbOperation = new DbOperation<string>(dataAccess);
        var sqlConnection = new SqlConnection();
        dbOperation.Insert("blah", sqlConnection, "MySP");

        dataAccess.AssertWasCalled(a => a.ExecuteNoneQuery(
            Arg.Is(sqlConnection), 
            Arg.Is("MySP"), 
            Arg<IEnumerable<SqlParameter>>.Is.Anything));
    }

Ideally, you may want to even inject IDbObjectFactory<T> so that you can test the interaction between DbOperation and the sqlParameterFactory - and hence you could also check that ExecuteNoneQuery was called with the exact parameters that sqlParameterFactory would return. 理想情况下,您甚至可能希望注入IDbObjectFactory<T>以便可以测试DbOperation和sqlParameterFactory之间的交互-因此,您还可以检查是否已使用sqlParameterFactory返回的确切参数来调用ExecuteNoneQuery

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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