在Moq中创建具有不同行为的同一类型的多个实例(使用Autofac)

时间:2015-04-13 02:36:16

标签: c# unit-testing moq autofac

我正在尝试在具有相同对象的4个实例的类上编写单元测试(对象是硬件的接口,该类是硬件配置的管理器)。我使用过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实例返回false。我可以使用一个序列,但这会将测试逻辑与实现逻辑显着联系起来(调用顺序等)。

我问的可能吗?

1 个答案:

答案 0 :(得分:2)

您可以尝试创建两个模拟对象(两次调用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??
}