模拟接口的多个实例:最后一个模拟的设置会影响其他人
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 };
根据我关于
我构建了一个 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 };