Entity framework 如何模拟context.Database.Connection.CreateCommand
我喜欢模拟以下内容,以确保调用ExecuteOnQuery,但不确定如何执行,因为我尝试了,但遇到了可能的异常,无法正确实现..我使用的是Rhino mockEntity framework 如何模拟context.Database.Connection.CreateCommand,entity-framework,unit-testing,rhino-mocks,Entity Framework,Unit Testing,Rhino Mocks,我喜欢模拟以下内容,以确保调用ExecuteOnQuery,但不确定如何执行,因为我尝试了,但遇到了可能的异常,无法正确实现..我使用的是Rhino mock using (var command = _context.Database.Connection.CreateCommand()) { command.CommandText = @"testproc_ins"; command.CommandTyp
using (var command = _context.Database.Connection.CreateCommand())
{
command.CommandText = @"testproc_ins";
command.CommandType = CommandType.StoredProcedure;
SqlParameter[] parameters = GetParameters(transaction);
command.Parameters.AddRange(parameters);
command.Connection.Open();
command.ExecuteNonQuery();
command.Connection.Close();
}
诀窍在于如何安排代码,以便可以用模拟对象替换真实对象。例如:
var command = CommandFactory.CreateCommand()
假设真实CommandFactory中的CreateCommand()是如上所述实现的,\u context.Database.Connection.CreateCommand()
,但在单元测试中,您有一个CommandFactory返回模拟
完成所有这些后,Rhino中的模拟非常简单:
var cmd = MockRepository.GenerateStub<IDbCommand>();
// Somehow pass mock cmd to code under test. For example,
// CommandFactory here could itself be a mock, and you tell it
// to return the mock cmd you created earlier:
SomeObject.CommandFactory.Stub(c => c.CreateCommand()).Return(cmd);
// Act
// Do something
// Assert
cmd.AssertWasCalled(c => c.ExecuteNonQuery()));
var cmd=MockRepository.GenerateStub();
//以某种方式将mock cmd传递给被测代码。例如
//这里的CommandFactory本身可能是一个模拟品,你可以这么说
//要返回先前创建的mock cmd,请执行以下操作:
SomeObject.CommandFactory.Stub(c=>c.CreateCommand()).Return(cmd);
//表演
//做点什么
//断言
cmd.AssertWasCalled(c=>c.ExecuteOnQuery());
您的意思不是说我需要将_context.Database.Connection.CreateCommand()放在CommandFactory中并模拟它们。但是我不喜欢为一行创建CommandFactory类。欢迎来到使用模拟对象进行单元测试的世界:)有时这很痛苦,但没有其他简单的方法-您必须以某种方式注入依赖项,而您的依赖项就是创建命令的对象。另一种方法是围绕_context提供您自己的包装器,这样_context.Database.Connection就在您的直接控制之下-但我不知道这是否更容易。嗨,您的第二个想法对我有用。我将_context.Database.Connection作为虚拟方法包装到context类中,以便能够通过模拟来控制它。谢谢你,伙计。