Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/kubernetes/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework 如何模拟context.Database.Connection.CreateCommand_Entity Framework_Unit Testing_Rhino Mocks - Fatal编程技术网

Entity framework 如何模拟context.Database.Connection.CreateCommand

Entity 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

我喜欢模拟以下内容,以确保调用ExecuteOnQuery,但不确定如何执行,因为我尝试了,但遇到了可能的异常,无法正确实现..我使用的是Rhino mock

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类中,以便能够通过模拟来控制它。谢谢你,伙计。