将Moq模拟对象传递给构造函数

sti*_*k81 56 .net c# moq mocking

我一直在使用RhinoMocks,但刚开始研究Moq.我有这个非常基本的问题,令我感到惊讶的是,这并不是开箱即用的.假设我有以下类定义:

public class Foo
{
    private IBar _bar; 
    public Foo(IBar bar)
    {
        _bar = bar; 
    }
    ..
}
Run Code Online (Sandbox Code Playgroud)

现在我有一个测试,我需要模拟发送到Foo的IBar.在RhinoMocks中,我会像下面这样做,它会很有效:

var mock = MockRepository.GenerateMock<IBar>(); 
var foo = new Foo(mock); 
Run Code Online (Sandbox Code Playgroud)

但是,在Moq中,这似乎并没有以同样的方式起作用.我这样做:

var mock = new Mock<IBar>(); 
var foo = new Foo(mock); 
Run Code Online (Sandbox Code Playgroud)

然而,现在它失败了 - 告诉我"无法从'Moq.Mock'转换为'IBar'.我做错了什么?用Moq做这个的推荐方法是什么?

sky*_*oot 101

您需要传递mock的对象实例

var mock = new Mock<IBar>();  
var foo = new Foo(mock.Object);
Run Code Online (Sandbox Code Playgroud)

您还可以使用模拟对象来访问实例的方法.

mock.Object.GetFoo();
Run Code Online (Sandbox Code Playgroud)

moq docs


Mas*_*uso 23

var mock = new Mock<IBar>().Object
Run Code Online (Sandbox Code Playgroud)

  • 我通常不会将对象实例分配给这样的变量,因为您可能希望为特定行为设置模拟. (2认同)