模拟接口的多个实例:最后一个模拟的设置会影响其他人

Mocking multiple instances of interface: Setup of the last mock affects the others

根据我关于

的问题

我构建了一个 BooService,它有一个 IFooService[] 的注入数组,还有一个 FooFactory 方法,return 一个基于给定键的 foo 服务运行次。

class BooService
{
    readonly IFooService[] _fooServices;

    BooService(IFooService[] services)
    {
        this._fooServices = services;
    }
    IFooService FooFactory(Guid id)
    {
        IFooService fooService = Array.Find(this._fooServices, 
                                     service => service.Id == id);
        return fooService;
    }
}

public class FooService1 : IFooService
{
    public int Id { get { return 1; }  
}
public class FooService2 : IFooService
{
    public int Id { get { return 2; }  
}

运行 时一切正常,但我的单元测试失败:

AutoMock _mock = Autofac.Extras.Moq.AutoMock.GetLoose();
Mock<IFooService> fooService1 = _mock.Mock<IFooService>();
fooService1
    .Setup(x => x.Id)
    .Returns(1);

Mock<IFooService> fooService2 = _mock.Mock<IFooService>();
fooService2
    .Setup(x => x.Id)
    .Returns(2);

IFooService[] fooServices = new IFooService[] { fooService1.Object, fooService2.Object };

BooService booService = new BooService(fooServices);
booService.FooFactory(1); //Result in null
booService.FooFactory(2); //Result in "fooService2"

对于 1 的 id,Array.Find(this._fooServices, ...); 的行代码导致 null

当我评论创建模拟接口的第二个实例时,booService.FooFactory(1); 的代码导致 fooService1。 所以我猜第二个 Setup 会以某种方式影响第一个实例。

任何建议为什么在创建接口的两个模拟实例时 Array.Find(...) 只找到最后创建的模拟实例

如果它是 Moq 中的错误:是否有任何干净的解决方法来对查找过程进行单元测试?

_mock.Mock<IFooService>()

每次调用都会 return 相同的模拟实例,因此设置实际上是在一个实例上完成的。每次都以最后设置为准。

这是手动方法

IFooService fooService1 = Mock.Of<IFooService>(_ => _.Id == 1);
IFooService fooService2 = Mock.Of<IFooService>(_ => _.Id == 2);

IFooService[] fooServices = new IFooService[] { fooService1.Object, fooService2.Object };