如何用Moq模拟Autofac聚合服务?

时间:2018-12-30 23:13:54

标签: c# unit-testing moq autofac

我在.NET 4.6.2上,并通过Nuget使用以下版本的程序集:

服务

Autofac-4.8.1

Autofac.Extras.AggregateService-4.1.0

Autofac.Wcf-4.1.0

Castle.Core-4.3.1

测试

Autofac.Extras.Moq-4.3.0

Moq-4.10.1

我为主机容器使用的设置与Docs中的“入门”示例完全一样,最后得到了由DynamicProxy生成的代理,通过消除构造函数重载。

在对使用这种类型的注入的服务进行单元测试时,我似乎对如何正确地模拟它感到困惑。

我花了几个小时尝试各种方法,但都没有成功。这基本上就是我拥有的:

public interface IMyAggregateService
{
    IFirstService FirstService { get; }
    ISecondService SecondService { get; }
    IThirdService ThirdService { get; }
    IFourthService FourthService { get; }
}

public class SomeController
{
    private readonly IMyAggregateService _aggregateService;

    public SomeController(IMyAggregateService aggregateService)
    {
        _aggregateService = aggregateService;
    }
}

using (var mock = AutoMock.GetLoose())
{
    //var depends = mock.Mock<IMyAggregateService>().SetupAllProperties(); //Not working 

    //depends.SetupProperty(p => p.IFirstService, ?? );
    //depends.SetupProperty(p => p.ISecondService, ?? );
    //depends.SetupProperty(p => p.IThirdService, ?? );
    //depends.SetupProperty(p => p.IFourthService, ?? );

    var sut = mock.Create<SomeController>();

    Action action = () => sut.SomeAction();

    action.Should().xxxx

}

所以我遇到的第一个问题是IMyAggregateService上没有设置方法,因此SetupProperty方法不起作用。当我使用SetupAllProperties时,所有内容在运行时均为null,因此将无法正常工作。我什至拉下了Autofac.Extras.AggregateService代码并检查了Test项目,但是除了AggregateServiceGenerator在某些时候可能有用之外,我实在无能为力。

我的问题是,

  

“如何正确模拟聚合服务,并在单元测试期间为其提供行为?”

为了获得额外的荣誉,我还想知道如何提供作为属性的任何依赖项的特定实现,例如:

using (var mock = AutoMock.GetLoose())
{
    mock.Provide<IFirstService>(this.MyImplProperty);

1 个答案:

答案 0 :(得分:1)

  

“如何正确模拟聚合服务并提供行为   是在单元测试期间吗?”

尝试做这样的事(它不是只使用momo才是automoq:))

JButton b = new JButton();
//Option One
ActionListener al = e -> System.out.println(e.getActionCommand());
b.addActionListener(al);
//Option Two
b.addActionListener(e -> System.out.println(e.getActionCommand()));
//Option Three
b.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
        System.out.println(e.getActionCommand());
    }
});
//Option Four
ActionListener al = new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
        System.out.println(e.getActionCommand());
    }
};
b.addActionListener(al);

然后您可以模拟服务的行为并验证调用,一些伪代码将如下所示。

var firstServiceImpl= new Mock<IFirstService>();
var secondServiceImp2= new Mock<ISecondService>();

var myAggregateServie= new Mock<IMyAggregateService>();

myAggregateServie.SetupGet(x => x.FirstService ).Returns(firstServiceImpl);
myAggregateServie.SetupGet(x => x.SecondService ).Returns(secondServiceImp2);
.
.
.