我在.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);
答案 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);
.
.
.