在 Moq 中创建具有不同行为的相同类型的多个实例(使用 Autofac)
Create multiple instances of the same type with different behaviour in Moq (with Autofac)
我正在尝试对具有相同对象的 4 个实例的 class 编写单元测试(对象是硬件的接口,class 是配置的管理器硬件)。我使用过 Autofac,所以我使用的是 Autofac.Extras.Moq
库。
我需要有多个模拟实例,具有不同的行为(基本上我试图通过设置 属性 来测试设备出现故障时的行为。我正在努力但我可以看到如何配置一个模拟来做我想做的事,但是当我改变行为时,它会改变那个模拟的所有实例,而不仅仅是模拟。
using(mock = AutoMock.GetLoose())
{
var goodHW = mock.Create<IHW>();
((Mock<IHW>)goodHW).Setup(x => x.OK).Returns(true);
var badHW = mock.Create<IHW>();
((Mock<IHW>)badHW).Setup(x => x.OK).Returns(false);
mock.Mock<IHWManager>().SetupGet(x => x.HW1).Returns(goodHW);
mock.Mock<IHWManager>().SetupGet(x => x.HW2).Returns(badHW);
Assert.AreNotEqual(goodHW, badHW) //FAILS!!!
}
由于这两个模拟实际上是同一个对象,goodHW 实例returns false。我可以使用一个序列,但是它将测试逻辑与实现逻辑显着联系起来(调用顺序等)
我问的可能吗?
您可以尝试创建两个模拟对象(调用 GetLoose()
两次)并以不同方式设置它们;然后用一个创建 goodHW
,另一个创建 badHW
像这样:
using(mockGood = AutoMock.GetLoose())
using(mockBad = AutoMock.GetLoose())
{
var goodHW = mockGood.Create<IHW>();
((Mock<IHW>)goodHW).Setup(x => x.OK).Returns(true);
var badHW = mockBad.Create<IHW>();
((Mock<IHW>)badHW).Setup(x => x.OK).Returns(false);
mockGood.Mock<IHWManager>().SetupGet(x => x.HW1).Returns(goodHW);
mockBad.Mock<IHWManager>().SetupGet(x => x.HW2).Returns(badHW);
Assert.AreNotEqual(goodHW, badHW) // SUCCESS??
}
我正在尝试对具有相同对象的 4 个实例的 class 编写单元测试(对象是硬件的接口,class 是配置的管理器硬件)。我使用过 Autofac,所以我使用的是 Autofac.Extras.Moq
库。
我需要有多个模拟实例,具有不同的行为(基本上我试图通过设置 属性 来测试设备出现故障时的行为。我正在努力但我可以看到如何配置一个模拟来做我想做的事,但是当我改变行为时,它会改变那个模拟的所有实例,而不仅仅是模拟。
using(mock = AutoMock.GetLoose())
{
var goodHW = mock.Create<IHW>();
((Mock<IHW>)goodHW).Setup(x => x.OK).Returns(true);
var badHW = mock.Create<IHW>();
((Mock<IHW>)badHW).Setup(x => x.OK).Returns(false);
mock.Mock<IHWManager>().SetupGet(x => x.HW1).Returns(goodHW);
mock.Mock<IHWManager>().SetupGet(x => x.HW2).Returns(badHW);
Assert.AreNotEqual(goodHW, badHW) //FAILS!!!
}
由于这两个模拟实际上是同一个对象,goodHW 实例returns false。我可以使用一个序列,但是它将测试逻辑与实现逻辑显着联系起来(调用顺序等)
我问的可能吗?
您可以尝试创建两个模拟对象(调用 GetLoose()
两次)并以不同方式设置它们;然后用一个创建 goodHW
,另一个创建 badHW
像这样:
using(mockGood = AutoMock.GetLoose())
using(mockBad = AutoMock.GetLoose())
{
var goodHW = mockGood.Create<IHW>();
((Mock<IHW>)goodHW).Setup(x => x.OK).Returns(true);
var badHW = mockBad.Create<IHW>();
((Mock<IHW>)badHW).Setup(x => x.OK).Returns(false);
mockGood.Mock<IHWManager>().SetupGet(x => x.HW1).Returns(goodHW);
mockBad.Mock<IHWManager>().SetupGet(x => x.HW2).Returns(badHW);
Assert.AreNotEqual(goodHW, badHW) // SUCCESS??
}